http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
n<=4,数不大枚举,从(1,1)枚举到(n,n),但是第三组数据通不过,我的思路是有错误的,
用回溯的方法,嗯,挺神奇的方法,虽然以前也用过回溯,还是有点震惊,以上是闲话
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define MAX(a,b)a>b?a:b
using namespace std;
int map[5][5];
bool vx[5],vy[5];
int n,mAX;
bool judge(int x,int y)
{
for(int i=x-1;i>=0;i--)
{
if(map[i][y]==2)return 0;
if(map[i][y]==1)break;
}
for(int i=y-1;i>=0;i--)
{
if(map[x][i]==2)return 0;
if(map[x][i]==1)break;
}
return 1;
}
void dfs(int u,int cnt)
{
if(u==n*n)
{
mAX=MAX(mAX,cnt);
return;
}
int r=u/n;
int c=u%n;
if(!map[r][c])
{
if(judge(r,c))
{
map[r][c]=2;
dfs(u+1,cnt+1);
map[r][c]=0;
}
}
dfs(u+1,cnt);
return ;
}
int main()
{
int i,j;
char ch;
while(cin>>n&&n)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>ch;
if(ch=='X')
map[i][j]=1;
}
mAX=0;
dfs(0,0);
cout<<mAX<<endl;
}
return 0;
}