蛋疼的题,我纠结了好久,最后看了人家的代码才A过去的,俺的搜索还是如此之烂……
数据比较弱,最大才4*4,所以直接暴搜,把二维的数组变成线性一维,所以只用考虑后面的点,具体见下面的代码。
(这是百度来的代码,非原创……)
#include<stdio.h>
int n,max;
char map[5][5];
int canput(int a,int b)
{
int i;
for(i=a-1;i>=0;i--)
{
if(map[i][b]=='O') return 0;
if(map[i][b]=='X') break;
}
for(i=b-1;i>=0;i--)
{
if(map[a][i]=='O') return 0;
if(map[a][i]=='X') break;
}
return 1;
}
void f(int k,int t)
{
int x,y;
if(k==n*n)
{
if(t>max)
{
max=t;return;
}
}
else
{
x=k/n; y=k%n;
if(map[x][y]=='.' && canput(x,y))
{
map[x][y]='O';
f(k+1,t+1);
map[x][y]='.';
}
f(k+1,t);
}
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
getchar();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%c",&map[i][j]);
getchar();
}
max=-1;
f(0,0);
printf("%d/n",max);
}
return 0;
}