zoj1002 FIRE NET(搜索算法DFS)

来源:互联网 发布:php.ini 超时设置 编辑:程序博客网 时间:2024/05/21 10:00

1、问题描述
2、对每个单元格进行标号,然后递归,对每个单元格采取能放则放和不放两种决策。形成决策树。
3、

#include <iostream>#include<cmath>using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */#define maxn 4char s[maxn][maxn];int ibest,n;bool judge(int row,int col){//想左上方向判断,因为该坐标右下一定没有碉堡     int i;    for(i=row-1;i>-1;i--){        if(s[i][col]=='X')break;        if(s[i][col]=='O')return false;    }     for(i=col-1;i>-1;i--){        if(s[row][i]=='X')break;        if(s[row][i]=='O')return false;    }     return true;}void solve(int k,int current){    int x,y;    if(k=n*n){        ibest=max(current,ibest);        return;    }    x=k/n;//将序号转化为坐标     y=k%n;    if(s[x][y]=='.'&&judge(x,y)){        s[x][y]='O';        solve(k+1,current+1);//注意这里并没有改变current和k的值         s[x][y]='.';//注意恢复单元格     }    solve(k,current);}int main(int argc, char** argv) {    int i,j;    while(cin>>n&&n){        for(i=0;i<n;i++){            for(j=0;j<n;j++)            cin>>s[i][j];        }        ibest=0;        solve(0,0);        cout<<ibest;    }     return 0;}
0 0