【POJ】1164【搜索】【The Castle】

原文链接:http://poj.org/problem?id=1164



每个小格1*1都有四个面,东西南北,如图*代表在该小格该面有wall;至于输入设置,例如11=1+2+8,意味着(0,0)这个格的W、N和S方向有wall。

我的代码:
#include <stdio.h>

struct{
    int E;
    int S;
    int W;
    int N;
    int flag;
} map[50][50]; //地图,有E、S、W、N顺序的四个方向,flag作为是否走过的标记

int n,m,max,sum;//max为最大房间的格数
void DFS(int i,int j){
    if(sum>max)
        max=sum;
    if(!map[i][j].flag){
        if(!map[i][j].E){
            map[i][j].flag=1;
            if(!map[i][j+1].flag){
                sum++;
                DFS(i,j+1);
            }
        }
        if(!map[i][j].S){
            map[i][j].flag=1;
            if(!map[i+1][j].flag){
                sum++;
                DFS(i+1,j);
            }
        }
        if(!map[i][j].W){
            map[i][j].flag=1;
            if(!map[i][j-1].flag){
                sum++;
                DFS(i,j-1);
            }
        }
        if(!map[i][j].N){
            map[i][j].flag=1;
            if(!map[i-1][j].flag){
                sum++;
                DFS(i-1,j);
            }
        }
    }
    else
        return ;
}

int main(){
    int i,j,num=0,date,num1=0;
    scanf("%d%d",&n,&m);//m列n行
    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
            scanf("%d",&date);
            //以下四个if用来将1、2、4、8转换为四个方向有无wall的0、1值
            if(date%2){
                map[i][j].W=1;
                date--;
            }
            if(!(date<8)){
                map[i][j].S=1;
                date-=8;
            }
            if(!(date<4)){
                map[i][j].E=1;
                date-=4;
            }
            if(date==2)
                map[i][j].N=1;
        }
    }//这两个for循环套用只是为了上一次房间格数找到后,重新寻找未被标记的房间
    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
            if(!map[i][j].flag){
                sum=1;
                DFS(i,j);
                num++;
                num1+=max;
            }
        }
        if(num1==n*m)//nun1累加每次找的的房间格数,当找到n*m个格数可直接break,即所谓的剪枝
            break;
    }
    printf("%d\n%d\n",num,max);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值