这题比起八皇后问题更复杂。有两种状态转移方式:直接进入下一行搜索;在这一行选一个,仍在这一行搜索。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Pos
{
int x,y;
};
Pos C[16];
int n,max,mat[6][6],vis[6][6];
int is_capture(int x,int y,int s)
{
int i,j,ok;
for(i=0;i<s;i++)
{
if(C[i].x==x)
{
ok=1;
int y1,y2;
y1=C[i].y<y? C[i].y:y;
y2=C[i].y+y-y1;
//printf("%d %d\n",y1,y2);
for(j=y1+1;j<y2;j++) if(mat[C[i].x][j])
{
ok=0;
break;
}
if(ok) return 1;
}
if(C[i].y==y)
{
int x1,x2;
x1=C[i].x<x? C[i].x:x;
x2=C[i].x+x-x1;
ok=1;
//printf("%d %d\n",x1,x2);
for(j=x1+1;j<x2;j++) if(mat[j][y])
{
ok=0;
break;
}
if(ok) return 1;
}
}
return 0;
}
void search(int cur,int s)
{
if(cur==n)
{
if(max<s) max=s;
}
else
{
for(int i=0;i<n;i++) if(!mat[cur][i] &&
!vis[cur][i] && !is_capture(cur,i,s))
{
C[s].x=cur;
C[s].y=i;
vis[cur][i]=1;
search(cur,s+1);
//search(cur+1,s+1);
vis[cur][i]=0;
}
search(cur+1,s);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("639.txt","r",stdin);
#endif
char s[6];
while(scanf("%d",&n)==1 && n)
{
int i,j;
memset(mat,0,sizeof(mat));
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
scanf("%s",s);
for(j=0;j<n;j++)
if(s[j]=='X') mat[i][j]=1;
else mat[i][j]=0;
}
//for(i=0;i<n;i++,printf("\n"))
//for(j=0;j<n;j++) printf("%d",mat[i][j]);
max=0;
search(0,0);
printf("%d\n",max);
}
return 0;
}