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

2022-03-12 22:38:44 字數 2684 閱讀 3994

棋局評估 

問題描述

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 a[3][3

];//

判斷行是否勝利 ,at為第幾行,id為是誰在下棋,1為alice,2為bob

bool row(int at,int

id)

return

false;}

//判斷列是否勝利 ,at為第幾行,id為是誰在下棋,1為alice,2為bob

bool line(int at,int

id)

return

false;}

//如果勝利計算當前棋盤的得分

int sum(int

id) }

}

//alice勝利,得分為正

if(id == 1

)

else

} void

show()

cout

<

}cout

<

判斷是否獲勝

bool win(int

id) }

//再比較當前局面的列

for(int i=0;i<3;i++)

}//比較對角線

if(a[0][0] == id && a[1][1] == id && a[2][2] ==id)

if(a[0][2] == id && a[1][1] == id && a[2][0] ==id)

//判斷是否勝利

if(yes)

else

} //

對抗搜尋,每個人都取對自己最有利的得分

int dfs(int

id)

//max表示 alice能得的最高分

int maxnum = -1000

;

//min表示bob能得到的最高分

int minnum = 1000

;

//遍歷所有情況

//並判斷當前局面,用當前最大值與對手回合的最大值進行比較

for(int i=0;i<3;i++)

//每個人都假設自己能贏,用自己的最高分和對手的下一次進攻最高分比相比較,

//對手能贏返回正,不能贏返回0

//如果判斷此種局面贏不了,則會返回乙個負值

if(id == 1

)

else

//回溯

a[i][j] = 0

; }}}

return id==1 ?maxnum : minnum;

}int

main()

}if(win(1

))

if(win(2

))

int res = dfs(1

); cout

<< res <

}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贏則得分為負,所以搜尋在哪個空位落子是最優的選擇時,可以通過在棋盤的空白處上不斷嘗試放棋,對於alic...