201803-4 CFF 棋局評估
阿新 • • 發佈:2019-01-11
對抗搜尋。
感謝這位博主的分享,給了我很大幫助。
主要用到了圖裡面的公式。下面剪枝我沒看呢還。
這次的程式碼應該不算shi了吧……
雖然也不是很好就是了。
另外這次最後的編譯一次通過,小小開心一下……
不過寫得很慢,考試肯定來不及……
#include<iostream> #include<list> #include<cstring> using namespace std; #define Alice 1 #define Bob 2 #define Win 0 #define NotEnd 1 #define Lose 2 #define Equal 3 int checkState(char (&state)[3][3]); int MaxMinValue(char (&state)[3][3],char player); int getScore(char (&state)[3][3]); class point{ public: char x,y; point(char x,char y){ this->x=x; this->y=y; } }; // { // cout<<"In MaxMinValue:"<<endl; // for(int i=0;i<3;i++){ // for(int j=0;j<3;j++){ // cout<<(int)state[i][j]<<" "; // } // } // cout<<endl; //} int main(){ char state[3][3]; int n; cin>>n; list<int> result; for(int k=0,m;k<n;k++){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ cin>>m; state[i][j]=m; } } result.push_back(MaxMinValue(state,Alice)); } // char state[3][3]={1,2,1,2,1,2,0,0,0}; // cout<<MaxMinValue(state,Alice)<<endl; while(!result.empty()){ cout<<result.front()<<endl; result.pop_front(); } // for(int i=0;i<3;i++){ // for(int j=0;j<3;j++){ // cout<<(int)state[i][j]<<" "; // } // } // cout<<endl; return 0; } int MaxMinValue(char (&state)[3][3],char player){ switch(checkState(state)){ case NotEnd: break; case Win: return getScore(state); case Lose: return -getScore(state); case Equal: return 0; default: cout<<"Error! Illegal checkState() result"<<endl; } list<point> pointList; list<int> scoreList; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(state[i][j]==0){ pointList.push_back(point(i,j)); // cout<<"push_back "<<i<<","<<j<<endl; } } } for(point apoint(0,0);!pointList.empty();){ apoint=pointList.front(); char stateChild[3][3]; memcpy(stateChild,state,sizeof(state)); // for(int i=0;i<3;i++){ // for(int j=0;j<3;j++){ // cout<<(int)stateChild[i][j]<<" "; // } // } stateChild[apoint.x][apoint.y]=player; pointList.pop_front(); scoreList.push_back(MaxMinValue(stateChild,player==Alice?Bob:Alice)); } scoreList.sort(); return player==Alice?scoreList.back():scoreList.front(); // cout<<"ok"<<endl; } int checkState(char (&state)[3][3]){ // cout<<"checkState..."<<endl; for(int i=0;i<3;i++){ if(state[i][0]==state[i][1]&& state[i][1]==state[i][2]){ if(state[i][0]==Alice){ return Win; }else if(state[i][0]==Bob){ return Lose; } } } for(int i=0;i<3;i++){ if(state[0][i]==state[1][i]&& state[1][i]==state[2][i]){ if(state[0][i]==Alice){ return Win; }else if(state[0][i]==Bob){ return Lose; } } } if((state[0][0]==state[1][1]&& state[1][1]==state[2][2])|| (state[0][2]==state[1][1]&& state[1][1]==state[2][0])){ if(state[1][1]==Alice){ return Win; }else if(state[1][1]==Bob){ return Lose; } } for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(state[i][j]==0){ return NotEnd; } } } return Equal; } int getScore(char (&state)[3][3]) { // cout<<"getScore..."<<endl; int counter=1; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(state[i][j]==0){ counter++; } } } return counter; }