201803 4 棋局評估

2021-09-25 16:48:43 字數 1660 閱讀 3049

這道題當初卡了我不知道多少遍,每次動手想做一下csp認證的第三道題,都從這道題開始,但每次都被卡住。直接是連題意都有點讀不懂,但是讀懂了之後就會發現,這道題除了特別繁瑣之外,好像也沒用到什麼很難的演算法。

借鑑了這位大佬的思路:

我沒發現比這個還簡潔的**,所以就學了一下這個思路,比較容易理解。

對這道題,我其實是無從下手的。究其原因,在於:1.字串匹配的題目做的太少了,沒做幾道。2.不太會stringstream流操作,所以對複雜的字串操作不夠靈活。3.資料結構沒想出來,不知道用什麼來存這麼多的字串。

題目大意是這樣的,給出一連串匹配規則,以及一連串待匹配字串。對每個待匹配字串,要拿每乙個規則匹配它,如果匹配成功,就輸出這個規則名稱,以及成功匹配的引數部分(即用題中的str、int、path成功匹配的部分,其他的成功匹配不輸出);如果對所有規則都不匹配,就輸出404。

先開乙個一維字串陣列,存放所有原始規則,再開乙個二維字元陣列,存放每乙個原始規則被'/'拆分後的部分。再開乙個一維整型陣列,存放每一條原始規則拆分後的部分數,再開乙個記號陣列,標記每一條原始陣列是否為'/'結尾。

之後開乙個二重迴圈,對每一條待匹配語句都對每一條規則進行比較,如果有乙個成立就跳出。匹配函式是乙個模組。對每乙個語句的匹配,都要拆分開來,一部分一部分匹配,這需要乙個拆分函式;對,需要檢查這個串是否是數字,如果是數字,需要返回去掉前導0的串,這也是乙個函式模組。那麼總起來,包括main函式,一共有四個模組,分開寫。

下面是**,部分關鍵地方有注釋。其實很顯然,難就難在對字串的拆分和匹配上了,資料結構想不出來,拆分不會,這題就是0分了。

程式中有很多小細節,個中巧妙之處,需要細細體會。

#include #define n 105

using namespace std;

string lim[n],lims[n][n],limname[n]; //lim是第i個規則字串,lims是第i個規則字串的拆分,limname是對應字串的名字

string now,nows[n]; //nows是當前被檢索字串的拆分

bool isop[n],iso; //isop判斷規則末尾有無斜槓,iso判斷位址末尾有無斜槓

int limcnt[n],nowcnt; //limcnt計數規則的拆分後項數,nowcnt計數當前被檢索字串的拆分後項數

void stcut(string ori,string cut,bool& is,int&num);

bool match(int j,int nc,string& a);

string isnum(string s);

int main()

for (int i=0;i>now;iso=0; //注意此處將iso置0

stcut(now,nows,iso,nowcnt);

string ans;

int f=0;

for (int j=0;j")

else if (lims[j][p2]=="")

if (p1>ss) cut[num++]=ss;;

}string isnum(string s)

return ans;

}

201803 4 棋局評估

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

201803 4 CFF 棋局評估

對抗搜尋。感謝這位博主的分享,給了我很大幫助。主要用到了圖裡面的公式。下面剪枝我沒看呢還。這次的 應該不算shi了吧 雖然也不是很好就是了。另外這次最後的編譯一次通過,小小開心一下 不過寫得很慢,考試肯定來不及 include include includeusing namespace std d...

ccf認證 201803 4 棋局評估

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