您的位置:首页 > 其它

Fire Net

2016-02-13 16:01 429 查看
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<cstdio>
#include<stack>
#include<queue>
#include<set>
using namespace std;
char mapp[5][5];
int best,n;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool canPut(int x,int y){
//第x行,第y列
for(int i=y-1;i>=0;i--){
if(mapp[x][i]=='1') return false;
if(mapp[x][i]=='X') break;
}
for(int i=x-1;i>=0;i--){
if(mapp[i][y]=='1') return false;
if(mapp[i][y]=='X') break;
}
return true;
}
void  dfs(int k,int current){
//cout<<k<<"  "<<current<<endl;
if(k==n*n){

if(best<current){
best=current;
// cout<<best<<"  best"<<endl;
return ;
}
}
else{
int x=k/n;
int y=k%n;
// if(k==2) cout<<x<<"  "<<y<<"  2"<<endl;
if(mapp[x][y]=='.'&&canPut(x,y)){
mapp[x][y]='1';
// cout<<x<<"  "<<y<<"放置跑  "<<endl;
dfs(k+1,current+1);
mapp[x][y]='.';
}
dfs(k+1,current);
}

}
int main(){
while(cin>>n){
memset(mapp,0,sizeof(mapp));
if(n==0) break;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mapp[i][j];
}
}

best=0;
dfs(0,0);
cout<<best<<endl;

/*深度优先搜索:每次遍历全局,注意回溯,规定放了炮弹的为1,不放的为0
找到最大的数目。
判断能不能放
*/
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: