/*
一次AC,题不难。
找错经历:
①处出错,不能使用sizeof()计算形参中数组长度
②G的状态应分三种情况讨论。
题意:一个棋盘,放置rook,要求不能在同一行或同一列,除非中间有墙。
思路:回溯+状态存储,G值为0表示有墙,为1表示可放,为-1表示有冲突。
*/
#include <cstdio>
#include <cstring>
int n;
int ans;
void dfs1(int (*G)[7],int x,int y)
{
G[x][y]=-1;//②
for(int i=x-1;i>=1;i--)
if(G[i][y])
G[i][y]=-1;
else
break;
for(int i=x+1;i<=n;i++)
if(G[i][y])
G[i][y]=-1;
else
break;
for(int i=y-1;i>=1;i--)
if(G[x][i])
G[x][i]=-1;
else
break;
for(int i=y+1;i<=n;i++)
if(G[x][i])
G[x][i]=-1;
else
break;
}
void dfs(int (*G)[7],int count)
{
int GG[7][7];
memcpy(GG,G,sizeof(GG));//不能使用形参中的数组①
bool ok=false;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(GG[i][j]==1)
{
//printf("%d %d\n",i,j);
ok=true;
dfs1(GG,i,j);
dfs(GG,count+1);
memcpy(GG,G,sizeof(GG));
}
}
if(!ok)
{
if(count>ans)
ans=count;
}
}
int main()
{
//freopen("data.in","r",stdin);
int G[7][7];
while(scanf("%d",&n) && n)
{
char c;
memset(G,0,sizeof(G));
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<n;j++)
{
c=getchar();
if(c=='.')
G[i+1][j+1]=1;
}
}
ans=0;
dfs(G,0);
printf("%d\n",ans);
}
}
639 Don't Get Rooked
最新推荐文章于 2018-07-03 14:54:04 发布