Fire Net
#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; }