刚拿到题目知道要用回溯,可是dfs里传参的思路有问题,卡壳了。。知道这个题目棋盘只有4*4,可以穷举,传递当前车的数量,每一次都与最大值比较。此题得到一个经验,dfs传递的参数可以是结果,根据题目要求在每一次掉用都与当前最值比较,当然,这是在题目数据量不大的情况下。
#include<stdio.h>
#include<string.h>
int n,vis[10][10],ans;
char mat[10][10];
int judge(int x,int y)
{
int i,tmp=1;
for(i=1;i<=n;i++)
if(mat[x][i]=='X')
tmp=i;
for(i=tmp;i<=n&&mat[x][i]!='X';i++)
if(mat[x][i]=='!') return 0;
tmp=1;
for(i=1;i<=n;i++)
if(mat[i][y]=='X')
tmp=i;
for(i=tmp;i<=n&&mat[i][y]!='X';i++)
if(mat[i][y]=='!') return 0;
return 1;
}
void dfs(int cur) //cur用来记录当前已有多少车
{
int i,j;if(cur>ans)
ans=cur;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(mat[i][j]=='.'&&judge(i,j))
{
mat[i][j]='!';
dfs(cur+1);
mat[i][j]='.';
}
}
int main()
{
while(~scanf("%d%*c",&n) && n)
{
memset(vis,0,sizeof(vis));
memset(mat,'X',sizeof(mat));
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%c",&mat[i][j]);
getchar();
}
ans=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}