http://acm.hdu.edu.cn/showproblem.php?pid=1045
分析:从第一个点到最后一个点依此暴搜
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int NM=10;
char str[NM][NM];
bool vis[NM][NM];
int mmax,num,n;
bool check(int x,int y){
//反向检查
for(int i=x-1;i>=0;i--){
if(str[i][y]=='X') break;
else if(vis[i][y]) return false;
}
for(int j=y-1;j>=0;j--){
if(str[x][j]=='X') break;
else if(vis[x][j]) return false;
}
return true;
}
void DFS(int t,int ans)
{
int x,y;
if(t==num){
if(ans>mmax) mmax=ans;
return;
}
x=t/n;y=t%n;
if(str[x][y]!='X' && check(x,y)){
vis[x][y]=1;
DFS(t+1,ans+1);
vis[x][y]=0;
}
DFS(t+1,ans); //
}
int main()
{
while(scanf("%d",&n) && n){
for(int i=0;i<n;i++){
scanf("%s",str[i]);
}
num=n*n;
memset(vis,0,sizeof(vis));
mmax=0;
DFS(0,0);
printf("%d\n",mmax);
}
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
char str[5][5];
int MAX,n;
void DFS(int i,int ans)
{
int x,y,j,flag;
if(i==n*n)
{
if(ans>MAX)
MAX=ans;
return;
}
x=i/n;
y=i%n;
flag=0;
if(str[x][y]=='.')
{
for(j=x-1;j>=0;j--) //从后往前找,遇到'X'跳出
{
if(str[j][y]=='*') flag=1;
if(str[j][y]=='X') break;
}
for(j=y-1;j>=0;j--)
{
if(str[x][j]=='*') flag=1;
if(str[x][j]=='X') break;
}
if(!flag)
{
str[x][y]='*';
DFS(i+1,ans+1);//
str[x][y]='.';
}
}
DFS(i+1,ans);//
}
int main()
{
int i;
while(cin>>n&&n)
{
for(i=0;i<n;i++)
cin>>str[i];
MAX=0;
DFS(0,0);
cout<<MAX<<endl;
}
return 0;
}