#include <stdio.h>
char map[4][4];
int best,n;
int canput(int row, int col)
{
int i;
for (i = row - 1; i >= 0; i--)
{
if (map[i][col] == 'o') return 0;
if (map[i][col] == 'x') break;
}
for (i = col - 1; i >= 0; i--)
{
if (map[row][i] == 'o') return 0;
if (map[row][i] == 'x') break;
}
return 1;
}
void solve(int k,int tot)
{
int x,y;
if(k==n*n)
{
if(tot>best)
{
best=tot; return;
}
}
else
{
x=k/n;
y=k%n;
if((map[x][y]=='.') && (canput(x,y) ) )
{
map[x][y]='o';
solve(k+1,tot+1);
map[x][y]='.'; ??为什么要加这句语句
}
solve(k+1,tot);
}
}
int main()
{
int i,j;
scanf("%d",&n);
while(n>0)
{
for(i=0;i< n;i++)
for(j=0;j< n;j++)
scanf("%1s",&map[i][j]);
best=0;
solve(0,0);
printf("%d\n",best);
n=0;
scanf("%d",&n);
}
return 0;
}
没来得及细看,因为你并未给出情景,我只看了你画的这部分,回溯有一个特征是返回上一状态,当map[x][y]=='.' && (canput(x,y) 时,回溯进行下一步 solve(k+1,tot+1); 这一步就让回溯进去了,将所有的这种可能进行遍历完,遍历完后要恢复状态 map[x][y]='.';
if((map[x][y]=='.' && (canput(x,y) ) )
{
map[x][y]='o';
solve(k+1,tot+1);
map[x][y]='.'; ??为什么要加这句语句
}