uvalive4836(枚举)
生活随笔
收集整理的這篇文章主要介紹了
uvalive4836(枚举)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
給出一個(gè)五子棋的棋面,問(wèn)先手或者后手是否能夠在三步之內(nèi)必勝。
思路:
只有三次下子,我們可以枚舉下的位置,分為以下三種情況:
①、先手在第一步就能獲勝,說(shuō)明棋面內(nèi)有4子相連。
②、后手在第二步的時(shí)候獲勝,說(shuō)明棋面上后手有至少兩個(gè)4子相連的情況。
③、先手在第三步的時(shí)候獲勝,這時(shí),先手在走第一步的時(shí)候,可能后手有一個(gè)4子相連,或者沒(méi)有4子相連,如果有一個(gè),那么先手就要去堵截,否則先手可以任意下子,接下來(lái),后手走第二步,這時(shí)候我們就可以用②來(lái)判斷先手是否必勝。
代碼:
#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; }總結(jié)
以上是生活随笔為你收集整理的uvalive4836(枚举)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uvalive4835(模拟)
- 下一篇: uvalive4838(凸包+重心)