1263.黑白棋(final)
时限:1000ms 内存限制:10000K 总时限:3000ms
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0
0 0 0 2 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1
#include<stdio.h>
int R,C,N;
int a[8][8];
int c[8][8];
int dirR[8]={0,1,1,1,0,-1,-1,-1};
int dirC[8]={-1,-1,0,1,1,1,0,-1};
void init();
int search(int r,int c,int m);
void search2(int r,int c,int m);
int count();
void refresh();
//步骤 初始化 循环(穷举判断能否落子 落子 修改棋盘状态 读取当前我方棋子个数 读取落子行列 恢复棋盘状态) 比较 输出
int main()
{
int i,j,k;
int temp1,temp2,temp3;
temp1=0;
temp2=0;
temp3=0;
init();//初始化
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]==0)//为0判断能够落子
{
a[i][j]=5;
for(k=0;k<8;k++)
{
if(search(i,j,k)==1)//判断能否落子
{
search2(i,j,k);
a[i][j]=5;
}
}
a[i][j]=N;
if(count()>temp1)
{
temp1=count();
temp2=i;
temp3=j;
}
}
refresh();
}
}
if(temp1!=1)
printf("%d %d\n",temp2,temp3);
else
printf("Impossible\n");
return 0;
}
int search(int r,int c,int m)
{
if(a[r][c]==N)
{
if(r-dirR[m]>=0 && r-dirR[m]<8 && c+dirC[m]>=0 && c+dirC[m]<8)
{
if(a[r-dirR[m]][c-dirC[m]]!=N && a[r-dirR[m]][c-dirC[m]]!=5)
return 1;
}
else
return 0;
}
else if(a[r][c]==0)
return 0;
else
{
if(r+dirR[m]>=0 && r+dirR[m]<8 && c+dirC[m]>=0 && c+dirC[m]<8)
{
r=r+dirR[m];
c=c+dirC[m];
search(r,c,m);
}
else
return 0;
}
}
void search2(int r,int c,int m)
{
if(a[r][c]==N)
return;
else
{
a[r][c]=N;
r=r+dirR[m];
c=c+dirC[m];
search2(r,c,m);
}
}
void init()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
scanf("%d",&a[i][j]);
}
}
scanf("%d",&N);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
c[i][j]=a[i][j];
}
}
}
int count()
{
int i,j;
int num;
num=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]==N)
num++;
}
}
return num;
}
void refresh()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=c[i][j];
}
}
}