題意:給出乙個4×4的點陣,連線相鄰點可以構成乙個九宮格,每個小格邊長為1。從沒有邊的點陣開始,兩人輪流向點陣中加邊,如果加入的邊構成了新的邊長為1的小正方形,則加邊的人得分。構成幾個得幾分,最終完成九宮格時,誰的分高誰贏。現在給出兩人前若干步的操作,問接下來兩人都採取最優策略的情況下,誰贏。
分析:博弈搜尋,有人說要加記憶化,我沒有加也過了……與赤裸裸的博弈搜尋的區別在於對於最終狀態,並不是誰無路可走誰輸,而是誰分低誰輸。注意判斷分數相等的情況。在搜尋中每個節點要麼是必勝態,要麼是必敗態,可參見這裡對np問題的描述:
邊的儲存與判斷不好處理,我是使用了edge_row[ ][ ]陣列來儲存橫向邊,edge_col[ ][ ]來儲存縱向邊。並用其左邊(橫向)或上邊(縱向)的點來代表這條邊。
#include #includeview code#include
using
namespace
std;
struct
point
point(
int x, int
y):x(x), y(y)
{}};bool edge_row[5][5
];bool edge_col[5][5
];bool
tom_turn;
intedge_num;
inttom_score, jerry_score;
point get_point(
inta)
void add_edge(point a, point b, bool
value)
intsquare(point a)
intget_score(point a, point b)
void
input()
}bool dfs(int next_score, int previous_score, bool
tom_turn)
if (!edge_col[j][i])}}
if (!did)
return
false;}
intmain()
return0;
}
2013 ACM ICPC 長春網路賽F題
題意 兩個人輪流說數字,第乙個人可以說區間 1 k 中的乙個,之後每次每人都可以說乙個比前乙個人所說數字大一點的數字,相鄰兩次數字只差在區間 1 k 誰先 n,誰輸。問最後是第乙個人贏還是第二個人贏。第乙個人搶到n 1的方法,就是先說乙個數字與n 1的差是k 1的整數倍。因為在這之後另乙個人無論說幾...
2013 ACM ICPC 長沙網路賽J題
題意 乙個數列,給出這個數列中的某些位置的數,給出所有相鄰的三個數字的和,數列頭和尾處給出相鄰兩個數字的和。有若干次詢問,每次問某一位置的數字的最大值。分析 設數列為a1 an。首先通過相鄰三個數字的和我們可以求出a3,a6,a9 是多少。a3 sum a1,a2,a3 sum a1,a2 a6 s...
2013ACM ICPC亞洲區南京站現場賽G題
題目大意 乙個n維的系統中隨機選乙個向量 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2。現在給定n,r。求xi的期望。其實是一道很簡單的數學題。首先證明 對於 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2 x...