日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uvalive4836(枚举)

發布時間:2025/3/15 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。