比较典型的一道暴力算法题,还需要用到模块分析的思想。Canput函数判断是否在x行y列可以放,Search函数穷举每一个方案,选出最优的来。暴力得用到递归,这是我的弱项,得需要恶补。
#include <stdio.h>
char map[4][5];
int maxCount;
int CanPut(int n, int x, int y)
{
int i;
i=x;
while(i>0 && map[i-1][y]!='X')
if (map[--i][y]=='O') return 0;
i=y;
while(i>0 && map[x][i-1]!='X')
if(map[x][--i]=='O') return 0;
return 1;
}
void Search(int n, int k, int curCount)
{
int x,y;
if(k==n*n)
{
if(curCount>maxCount)
maxCount=curCount;
return;
}
else
{
x=k/n;
y=k%n;
if(map[x][y]=='.' && CanPut(n,x,y))
{
map[x][y]='O';
Search(n, k+1, curCount+1);
map[x][y]='.';
}
Search(n,k+1,curCount);
}
}
int main()
{
int n,i,count;
while(scanf("%d",&n)!=EOF && n>0)
{
for(i=0;i<n;i++)
scanf("%s", map[i]);
maxCount=0;
Search(n, 0, 0);
printf("%d\n",maxCount);
}
return 0;
}