您的位置:首页 > 其它

ZOJ_1002_Fire Net

2012-03-10 20:42 330 查看
        这是一道搜索的简单题,题目的数据比较小,采用深搜就可以解决了、、、

代码如下:

#include<stdio.h>

char map[5][5];

int n,count;

//判断在(r,c)的位置是否可以放置碉堡,应为是从小到大开始找的,所以只往前找就可以了、、、

int Check_put(int r,int c){

    int i;

     //注意不要从小到大找,因为要考虑墙

    for(i=r-1; i>=0; i--){     //测试列上是否满足条件

        if(map[i][c] == 'o')

            return 0;

        if(map[i][c] == 'X')

            break;

    }

    for(i=c-1; i>=0; i--){     //测试行上是否满足条件

        if(map[r][i] == 'o')

            return 0;

        if(map[r][i] == 'X')

            break;

    }

    return 1;

}

void Dfs(int k,int cnt){

    int x,y;

    if(k == n*n){     //找到最后一个的时候进行判断

        if(cnt > count){     //保存此次查找能放的最大碉堡数

            count = cnt;

            return ;

        }

    }

    else{

        x = k/n;    //行号

        y = k%n;     //列号

        if(map[x][y]=='.' && Check_put(x,y)){     //当前可以放置碉堡,递归进入下一个位置

            map[x][y] = 'o';    //放置碉堡

            Dfs(k+1, cnt+1);     // 进入下一个位置

            map[x][y] = '.';     // 回溯

        }

        Dfs(k+1, cnt);     //当前点不能放置碉堡

    }

}

int main(){

    int i,j;

    while(scanf("%d",&n) , n){

        for(i=0; i<n; i++){   // 输入地图

            getchar();

            for(j=0; j<n; j++){

                scanf("%c",&map[i][j]);

            }

        }

        count = 0;    // 最多可以放置碉堡的数目

        Dfs(0,0);     //深搜

        printf("%d\n",count);

    }

    return 0;

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