描述:
经过前3题的热身相信大家已经对黑白棋有了一定的认识,下面我们来编写稍微复杂一点的模块。黑白棋并不像5子棋或者围棋一样可以在任意空白处下子,那么检测某个位置是否可以下子(如对规则还不是很了解,请参照前3题的规则介绍),也是我们黑白棋AI算法会经常调用的模块。下面需要同学们编写这一检测模块。
输入:
首先读入的是当前棋盘的状态,共8行,每行8个数字,1代表白棋,2代表黑棋,0代表为空格(未下子)。第9行有3个数字R C N,分别代表给定点的行、列还有所要下子的颜色。
输出:
输出对于这个位置是否可以落子,可以输出Yes,不可以则输出No.
输入样例:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 2 0 0 0 0 1 2 2 2 0 0 0 0 0 2 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 1
输出样例:
Yes
来源:
#include
int R,C,N;
int a[8][8];
void init();
int main()
{
intflag=1;
inti;
init();
if(a[R][C]==0)
{
if(C>=1){
for(i=C-1;i>=0;i--)//zuo
{
if(a[R][i]==0)
{
flag=0;
break;
}
if(a[R][i]==N&& a[R][i+1]==0 && i+1<8)
{
flag=0;
break;
}
if(a[R][i]==N&& a[R][i+1]!=N)
break;
if(i==0&& a[R][i]!=N)
{
flag=0;
break;
}
}
}
else
flag=0;
if(flag==0)
{
flag=1;
if(C<=6){
for(i=C+1;i<8;i++)//you
{
if(a[R][i]==0)
{
flag=0;
break;
}
if(a[R][i]==N&& a[R][i-1]==0)
{
flag=0;
break;
}
if(a[R][i]==N&& a[R][i-1]!=N)
break;
if(i==7&& a[R][i]!=N)
{
flag=0;
break;
}
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R>=1){
for(i=R-1;i>=0;i--)//shang
{
if(a[i][C]==0)
{
flag=0;
break;
}
if(a[i][C]==N&& a[i+1][C]==0 )
{
flag=0;
break;
}
if(a[i][C]==N&& a[i+1][C]!=N)
break;
if(i==0&& a[i][C]!=N)
{
flag=0;
break;
}
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R<=6){
for(i=R+1;i<8;i++)//xia
{
if(a[i][C]==0)
{
flag=0;
break;
}
if(a[i][C]==N&& a[i-1][C]==0)
{
flag=0;
break;
}
if(a[i][C]==N&& a[i-1][C]!=N)
break;
if(i==7&& a[i][C]!=N)
{
flag=0;
break;
}
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R>=1&& C<=6){
for(i=R-1;i>=0;i--)//youshang
{
if(a[i][C+R-i]==0&& C+R-i<8)
{
flag=0;
break;
}
if(a[i][C+R-i]==N&& a[i+1][C+R-i-1]==0 && C+R-i<8)
{
flag=0;
break;
}
if(a[i][C+R-i]==N&& a[i+1][C+R-i-1]!=N && C+R-i<8)
break;
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R<=6&& C>=1){
for(i=R+1;i<8;i++)//zuoxia
{
if(a[i][C+R-i]==0&& C+R-i>=0)
{
flag=0;
break;
}
if(a[i][C+R-i]==N&& a[i-1][C+R-i+1]==0 && C+R-i>=0)
{
flag=0;
break;
}
if(a[i][C+R-i]==N&& a[i-1][C+R-i+1]!=N && C+R-i>=0)
break;
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R>=1&& C>=1)
{
for(i=R-1;i>=0;i--)//zuoshang
{
if(a[i][C+i-R]==0&& C+i-R>=0)
{
flag=0;
break;
}
if(a[i][C+i-R]==N&& a[i+1][C+i-R+1]==0 && C+i-R>=0)
{
flag=0;
break;
}
if(a[i][C+i-R]==N&& a[i+1][C+i-R+1]!=N && C+i-R>=0)
break;
}
}
else
flag=0;
}
if(flag==0)
{
flag=1;
if(R<=6&& C<=6)
{
for(i=R+1;i<8;i++)//youxia
{
if(a[i][C+i-R]==0&& C+i-R<8)
{
flag=0;
break;
}
if(a[i][C+i-R]==N&& a[i-1][C+i-R-1]==0 && C+i-R<8)
{
flag=0;
break;
}
if(a[i][C+i-R]==N&& a[i-1][C+i-R-1]!=N && C+i-R<8)
break;
}
}
else
flag=0;
}
}
if(flag==1)
printf("Yes\n");
else
printf("No\n");
return0;
}
void init()
{
inti,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d",&R,&C,&N);
}