1.杭电1045 Fire Net
1.判断放入goal能否符合
2.由于要找出最多满足条件的goal的个数,因而采用dfs法,在放入goal的情况下进入下一层dfs,然后还原即回溯(这层的dfs没有goal)
#include <iostream>
#include <iomanip>
using namespace std;
const int maxnum=10000;
int n;
int maxx=0;
char mapp[maxnum][maxnum];
bool bo[maxnum][maxnum];
bool put(int x,int y){//判断能否放入,是否合理
int goalx=0, goaly=0;
for(int i=0;i<n;i++){
if(mapp[x][i]=='g'&& goalx==1) return false;
if(mapp[x][i]=='g') goalx=1;
if(mapp[x][i]=='X') goalx=0;
if(mapp[i][y]=='g'&& goaly==1) return false;
if(mapp[i][y]=='g') goaly=1;
if(mapp[i][y]=='X') goaly=0;
}
return true;
}
void dfs(int x){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mapp[i][j]=='.'&&!bo[i][j]){
mapp[i][j]='g';
if(put(i,j)){
if(x+1>maxx)maxx=x+1;
bo[i][j]=true;
dfs(x+1);
}
mapp[i][j]='.';
bo[i][j]=false;//当做这个位置不放的时候求最大值
}
}
}
}
int main(){
while(cin>>n){
if(n==0) return 0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mapp[i][j];
bo[i][j]=false;//是否放了goal
}
}
dfs(0);
cout<<maxx<<endl;
maxx=0;
}
}