ccf認證 201803 4 棋局評估

2021-09-26 05:41:14 字數 1744 閱讀 6163

題目:

alice和bob正在玩井字棋遊戲。

井字棋遊戲的規則很簡單:兩人輪流往3*3的棋盤中放棋子,alice放的是「x」,bob放的是「o」,alice執先。當同一種棋子佔據一行、一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。

alice設計了一種對棋局評分的方法:

- 對於alice已經獲勝的局面,評估得分為(棋盤上的空格子數+1);

- 對於bob已經獲勝的局面,評估得分為 -(棋盤上的空格子數+1);

- 對於平局的局面,評估得分為0;

bob已經獲勝(如圖),此局面得分為-(3+1)=-4。

第三組資料:

井字棋中若雙方都採用最優策略,遊戲平局,最終得分為0。

資料規模和約定

對於所有評測用例,1 ≤ t ≤ 5。

思路:採用對抗搜尋的方法,但和普通dfs十分相似,就是在的方式過程中每個子節點都取相對最優的那個答案即可(由此時的玩家的獲勝目標決定)。

**:

#include

using

namespace std;

struct node

;int g[5]

[5];

node judge()

if(g[1]

[i]== g[2]

[i]&& g[2]

[i]== g[3]

[i]&& g[1]

[i]>0&&

!flag)

for(

int j =

1; j <=

3; j++)}

if(g[1]

[1]== g[2]

[2]&& g[2]

[2]== g[3]

[3]&& g[1]

[1]>0&&

!flag)flag = g[1]

[1];

if(g[1]

[3]== g[2]

[2]&& g[2]

[2]== g[3]

[1]&& g[1]

[3]>0&&

!flag)flag = g[1]

[3];

node nd;

nd.w = flag;

if(flag ==

1)nd.s = cnt +1;

else

if(flag ==

2)nd.s =

-(cnt +1)

;else nd.s = cnt;

return nd;

}int

dfs(

int flag)

int tmp =

dfs(

!flag);if

(!flag)mmax =

max(mmax,tmp)

;else mmin =

min(mmin,tmp)

; g[i]

[j]=0;

}}}if

(!flag)

return mmax;

else

return mmin;

}int

main()

} node t =

judge()

;if(t.w >

0|| t.s ==0)

cout <<

dfs(0)

<<

"\n";}

return0;

}

CCF201803 4 棋局評估(100分)

問題描述 試題編號 201803 4 試題名稱 棋局評估 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔據一行 一列...

CCF201803 4棋局評估(100分)

這道題用對抗搜尋可以得到答案 試題編號 201803 4 試題名稱 棋局評估 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一...

ccf 201803 4 棋局評估 (對抗搜尋)

棋局評估 問題描述 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔據一行 一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。alic...