做完这道题,我发现自己越来越喜欢递归了。最初就是理解不了,现在却觉得用递归解决问题非常方便,哈哈!
最初这道题一会就把代码写好了,样例也过了,但就是WA。。。想了又想,还是没找出错误,最后搜了一下这道题的数据发现:
3
...
..X
.XX
这组数据过不去,我又仔细的画了一下递归过程,发现原来程序中k=0(k--那一步,原先是k=0)是错误的,因为在递归回溯的过程中,k值还可能被用到,故换成了k--,也就是在回溯一次a[i][j]=1的同时,让发现的可放数目k也回溯一次(减一),这样就顺利的把这道题AC了,呵呵!
递归递归我爱你!!!
#include<stdio.h>
#include<string.h>
int a[6][6],max,n,k;
void dfs()
{
int i,j,p,num=0;
int px[200],py[200];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]==1)
{
k++;
a[i][j]=-1;
for(p=j+1;p<=n;p++)
{
if(a[i][p]==0)
break;
else
if(a[i][p]==1)
{
a[i][p]=-1;
px[num]=i;
py[num]=p;
num++;
}
}
for(p=j-1;p>=1;p--)
{
if(a[i][p]==0)
break;
else
if(a[i][p]==1)
{
a[i][p]=-1;
px[num]=i;
py[num]=p;
num++;
}
}
for(p=i+1;p<=n;p++)
{
if(a[p][j]==0)
break;
else
if(a[p][j]==1)
{
a[p][j]=-1;
px[num]=p;
py[num]=j;
num++;
}
}
for(p=i-1;p>=1;p--)
{
if(a[p][j]==0)
break;
else
if(a[p][j]==1)
{
a[p][j]=-1;
px[num]=p;
py[num]=j;
num++;
}
}
dfs();
while(num)
{
num--;
a[px[num]][py[num]]=1;
}
if(k>max)
max=k;
a[i][j]=1;
k--; //原先错误的做法是 k=0;
}
}
}
int main()
{
int i,j;
char s[6];
while(scanf("%d",&n)&&n)
{
getchar();
max=k=0;
memset(a,0,sizeof(a));// 0 stand wall
for(i=0;i<n;i++)
{
gets(s);
for(j=0;j<n;j++)
if(s[j]=='.')
a[i+1][j+1]=1;
}
dfs();
printf("%d\n",max);
}
return 0;
}