这题目以前在ZOJ上看到过,就在前几题,当时吓呆了,但是现在看感觉这题目好水.....
整理一下思路,弄一个一样大的整型数组,然后一步一步遍历,我是从最后一个格子开始往第一个格子退,这样的话就只只用判断这个点横排后面的点和竖排后面的点是否冲突,不用往上看,最后弄成一个0,1矩阵,数出每次遍历完1的个数,然后跟最大值比就行。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int n;
char c[5][5];
int a[5][5];
int cnt=0;
int maxx=-1;
void dfs(int cur)
{
if(cur==-1)
{
cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==1) cnt++;
}
}
if(cnt>maxx) maxx=cnt;
return ;
}
for(int i=1;i>=0;i--)
{
int ok=1;
int x=0,y=0;
int l=cur;
while(l>=n) {l-=n;x++;}
y=l;
if(c[x][y]=='X') {ok=0;dfs(cur-1);}
if(i==1&&ok){
for(int j=x;j<n;j++){
if(c[j][y]=='X') break;
if(a[j][y]==1) {ok=0;break;}
}
for(int j=y;j<n;j++){
if(c[x][j]=='X') break;
if(a[x][j]==1) {ok=0;break;}
}
}
if(ok)
{
a[x][y]=i;
dfs(cur-1);
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
cnt=0;
maxx=0;
for(int i=0;i<n;i++)
scanf("%s",c[i]);
dfs(n*n-1);
cout<<maxx<<endl;
}
return 0;
}