这一题一开始没想明白怎么搜索比较好,后来去百度了一下借鉴了别人的方法,发现一个一个搜,最后dfs一下就搞定了。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string.h>
using namespace std;
int visit[10][10];
int cnt;
int MAX,n;
char str[10];
int Map[10][10]; //空的是0;有blackhouse的时候是1;有墙的时候是2;
bool Find(int x,int y){ //四个方向搜索上下左右,什么都没就继续,有blackhouse就返回0;有wall就break;
for(int i=y;i>=1;i--){
if(1==Map[x][i]){
return 0;
}
if(2==Map[x][i]) break;
}
for(int i=y;i<=n;i++){
if(1==Map[x][i]) return 0;
if(2==Map[x][i]) break;
}
for(int i=x;i>=1;i--){
if(1==Map[i][y]) return 0;
if(2==Map[i][y]) break;
}
for(int i=x;i<=n;i++){
if(1==Map[i][y]) return 0;
if(2==Map[i][y]) break;
}
return 1;
}
void Dfs(){
if(cnt>MAX){
MAX=cnt;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(!Map[i][j]&&Find(i,j)){
Map[i][j]=1;
cnt++;
Dfs();
Map[i][j]=0;
cnt--;
}
}
}
int main()
{
while(cin>>n&&n){
MAX=0;
cnt=0;
for(int i=1;i<=n;i++){
cin>>str;
for(int j=0;j<n;j++){
Map[i][j+1]=(str[j]=='X'? 2:0);
}
}
Dfs();
cout<<MAX<<endl;
}
}