題目:
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...