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;
}

 

posted @ 2016-02-13 16:01  咸咸的告别  阅读(232)  评论(0编辑  收藏  举报