uvalive4836(枚举)
生活随笔
收集整理的這篇文章主要介紹了
uvalive4836(枚举)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出一個五子棋的棋面,問先手或者后手是否能夠在三步之內必勝。
思路:
只有三次下子,我們可以枚舉下的位置,分為以下三種情況:
①、先手在第一步就能獲勝,說明棋面內有4子相連。
②、后手在第二步的時候獲勝,說明棋面上后手有至少兩個4子相連的情況。
③、先手在第三步的時候獲勝,這時,先手在走第一步的時候,可能后手有一個4子相連,或者沒有4子相連,如果有一個,那么先手就要去堵截,否則先手可以任意下子,接下來,后手走第二步,這時候我們就可以用②來判斷先手是否必勝。
代碼:
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<map> #include<vector> #include<climits>using namespace std;int a[20][20],nx,ny; char b[][10]={"white","black"};int judge(int now) {for(int i=0;i<15;i++)for(int j=0;j<15;j++){if(i<11&&j<11)if(a[i][j]==now&&a[i+1][j+1]==now&&a[i+2][j+2]==now&&a[i+3][j+3]==now&&a[i+4][j+4]==now)return 1;if(i<11)if(a[i][j]==now&&a[i+1][j]==now&&a[i+2][j]==now&&a[i+3][j]==now&&a[i+4][j]==now)return 1;if(j<11)if(a[i][j]==now&&a[i][j+1]==now&&a[i][j+2]==now&&a[i][j+3]==now&&a[i][j+4]==now)return 1;if(i>3&&j<11)if(a[i][j]==now&&a[i-1][j+1]==now&&a[i-2][j+2]==now&&a[i-3][j+3]==now&&a[i-4][j+4]==now)return 1;}return 0; }int judge1(int now) {int num=0,ok;for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=now;ok=judge(now);a[i][j]=-1;if(ok){nx=i;ny=j;return 1;}}return 0; }int judge2(int now) {int num=0,ok;for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=!now;ok=judge(!now);a[i][j]=-1;if(ok){num++;nx=i;ny=j;if(num==2)return num;}}return num; }int judge3(int now) {int ok;if(judge2(now)==1){int i=nx;int j=ny;a[i][j]=now;if(judge2(!now)==2){nx=i;ny=j;return 1;}elsereturn 0;}for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=now;ok=judge2(!now);a[i][j]=-1;if(ok==2){nx=i;ny=j;return 1;}} return 0; }int main() {int n;while(scanf("%d",&n)!=EOF){if(n==0)return 0;memset(a,-1,sizeof(a));int now=1;for(int i=0;i<n;i++){int x,y,k;scanf("%d%d%d",&x,&y,&k);if(k)now--;elsenow++;a[x][y]=k;}if(now!=0&&now!=1){printf("Invalid.\n");continue;}if(n<=5){printf("Cannot win in 3 moves.\n");continue;}if(judge1(now))printf("Place %s at (%d,%d) to win in 1 move.\n",b[now],nx,ny);else if(judge2(now)==2)printf("Lose in 2 moves.\n");else if(judge3(now))printf("Place %s at (%d,%d) to win in 3 moves.\n",b[now],nx,ny);elseprintf("Cannot win in 3 moves.\n");}return 0; }總結
以上是生活随笔為你收集整理的uvalive4836(枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uvalive4835(模拟)
- 下一篇: uvalive4838(凸包+重心)