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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 3683 Gomoku

發布時間:2024/4/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 3683 Gomoku 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDU_3683

這個題目由于情況不多,所以可以直接枚舉,只不過枚舉的時候需要注意一些細節。

枚舉順序如下:

①判斷我們1步是否能贏。

②判斷我們2步是否會輸。實際上如果第2步會輸,那么就相當于在當前棋盤狀態下,對方至少有2個地方可以在落子后連5。

??? ③判斷我們3步是否會贏。在這里需要討論一下,如果輪到③就說明我們在②的時候得到了兩種情況,對方有1個地方可以在落子后連5,或者沒有這樣的地方。如果有1個地方可以落子連5,那么這一步我們必須走這個位置,如果沒有這樣的位置,我們這步就可以隨意落子。枚舉我們的落子位置之后再判斷一下對方2步是否會輸即可(相當于又進行了一次②,只不過這時的對象由我們變成了對方)。

#include<stdio.h>
#include
<string.h>
int a[20][20],nx,ny;
char b[][10]={"white","black"};
int judge(now)
{
int i,j;
for(i=0;i<15;i++)
for(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 i,j,num=0,ok;
for(i=0;i<15;i++)
for(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 i,j,num=0,ok;
for(i=0;i<15;i++)
for(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 i,j,ok;
if(judge2(now)==1)
{
i
=nx;
j
=ny;
a[i][j]
=now;
if(judge2(!now)==2)
{
nx
=i;
ny
=j;
return 1;
}
else
return 0;
}
for(i=0;i<15;i++)
for(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 i,j,k,n,x,y,now;
while(1)
{
scanf(
"%d",&n);
if(n==0)
break;
memset(a,
-1,sizeof(a));
now
=1;
for(i=0;i<n;i++)
{
scanf(
"%d%d%d",&x,&y,&k);
if(k)
now
--;
else
now
++;
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);
else
printf(
"Cannot win in 3 moves.\n");
}
return 0;
}


總結

以上是生活随笔為你收集整理的HDU 3683 Gomoku的全部內容,希望文章能夠幫你解決所遇到的問題。

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