這道題用對抗搜尋可以得到答案
試題編號:
201803-4
試題名稱:
棋局評估
時間限制:
1.0s
記憶體限制:
256.0mb
問題描述:
問題描述
alice和bob正在玩井字棋遊戲。
井字棋遊戲的規則很簡單:兩人輪流往3*3的棋盤中放棋子,alice放的是「x」,bob放的是「o」,alice執先。當同一種棋子佔據一行、一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。
alice設計了一種對棋局評分的方法:
- 對於alice已經獲勝的局面,評估得分為(棋盤上的空格子數+1);
- 對於bob已經獲勝的局面,評估得分為 -(棋盤上的空格子數+1);
- 對於平局的局面,評估得分為0;
例如上圖中的局面,alice已經獲勝,同時棋盤上有2個空格,所以局面得分為2+1=3。
由於alice並不喜歡計算,所以他請教擅長程式設計的你,如果兩人都以最優策略行棋,那麼當前局面的最終得分會是多少?
輸入格式
輸入的第一行包含乙個正整數t,表示資料的組數。
每組資料輸入有3行,每行有3個整數,用空格分隔,分別表示棋盤每個格仔的狀態。0表示格仔為空,1表示格仔中為「x」,2表示格仔中為「o」。保證不會出現其他狀態。
保證輸入的局面合法。(即保證輸入的局面可以通過行棋到達,且保證沒有雙方同時獲勝的情況)
保證輸入的局面輪到alice行棋。
輸出格式
對於每組資料,輸出一行乙個整數,表示當前局面的得分。
樣例輸入
31 2 1
2 1 2
0 0 0
2 1 1
0 2 1
0 0 2
0 0 0
0 0 0
0 0 0
樣例輸出3-4
0樣例說明
第一組資料:
alice將棋子放在左下角(或右下角)後,可以到達問題描述中的局面,得分為3。
3為alice行棋后能到達的局面中得分的最大值。
第二組資料:
bob已經獲勝(如圖),此局面得分為-(3+1)=-4。
第三組資料:
井字棋中若雙方都採用最優策略,遊戲平局,最終得分為0。
資料規模和約定
對於所有評測用例,1 ≤ t ≤ 5
#include #include using namespace std;
int g[3][3];
int t;
int grades(int play) }}
return play ? -count : count;
}int win(int x)
//斜行
if ((g[0][0] == g[1][1] && g[0][0] == g[2][2] && g[0][0] == x) || (g[0][2] == g[1][1] && g[0][2] == g[2][0] && g[0][2] == x))
return 1;
return 0;
}int dfs(int play, int m)
if (play)
mingrade = min(dfs(!play, m - 1), mingrade);//交換對手下棋
else
maxgrade = max(dfs(!play, m - 1), maxgrade);
g[i][j] = 0;
}} }
return play ? mingrade : maxgrade;
}int main()
} if (win(2))//如果開局就勝利
cout << grades(1) <
else //最優策略下棋
cout << dfs(0, 9 - m) << endl;}}
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...
CCF 201803 4 試題名稱 棋局評估
參考部落格鏈結 只能說,太厲害了。第一眼看到這個題可以說是毫無思路,根本無從下手!這道題最大的難點我覺得在於怎麼實現最優策略行棋。在這道題中,由於題目的特殊性,題目定義alice贏則得分為正,bob贏則得分為負,所以搜尋在哪個空位落子是最優的選擇時,可以通過在棋盤的空白處上不斷嘗試放棋,對於alic...