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

原创 2013年12月03日 11:12:55

原文链接: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;
}


相关文章推荐

POJ 1164:The Castle

The Castle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6677   Accepted: 3767 ...

POJ 1164 The Castle 并查集做法

并查集做法的中心思想就是:没墙就合并到一起 #include #include #include #include #include #include...

【poj1164】The Castle,解题报告+思路+代码+数据

#include #include #include #include #include #include #define INPUT using namespace std; /** ...

poj 1164 The Castle (dfs)

http://poj.org/problem?id=1164 提交的时候正遇oj挂了,害我白白错了几次,却不知情。。。   #include "iostream" #include "stdio.h"...
  • Risir
  • Risir
  • 2011年08月02日 16:24
  • 409

poj 1164.The Castle

The Castle #include using namespace std; typedef struct node{ int east,south,west,north; bo...

poj_1164_The Castle(DFS)

题型:搜索 题意: 描述 1 2 3 4 5 6 7 ############################# 1 # | ...

USACO Section 2.1 The Castle (POJ 1164) floodfill

又是一道简单而又经典的搜索题,用floodfill一个房间一个房间的填充,每次都用标号标记一下,中间的围墙用二进制存储,这样搜索的时候就方便许多了。 最后再扫描一遍就能得出答案,注意扫描要从左下角开...

POJ 1164 The Castle

Description 1 2 3 4 5 6 7 #############################1 # | # | # | | ##...
  • Zarth
  • Zarth
  • 2016年01月22日 16:10
  • 467

poj 1164:The Castle

解题思路: (1)BFS

深度优先搜索(POJ1164 城堡问题)

深度优先搜索:具体做法就是沿着某条路走到尽头,如果没路了,就退回上一步,在寻找其他路线,如果再没路,继续退回上一路线,直到最开始。从而达到遍历的目的。 例题:POJ1164 The Castle ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【POJ】1164【搜索】【The Castle】
举报原因:
原因补充:

(最多只允许输入30个字)