【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: 6907   Accepted: 3877 ...
  • yskyskyer123
  • yskyskyer123
  • 2015年10月27日 20:55
  • 298

POJ 1164 The Castle 深搜入门(城堡问题)

题意:计算城堡一共有多少房间,最大的房间有多大(多少方块数构成最大的房间)? 城堡被分割成 R × C(R ...
  • tinyDolphin
  • tinyDolphin
  • 2017年11月28日 16:22
  • 72

poj 初期基本搜索

第三个专题了,初期基本搜索: 都是水题,两天完全可以刷完。。。 (1)、深度优先搜索 1、poj2488 题意:给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的...
  • consciousman
  • consciousman
  • 2017年01月19日 10:37
  • 567

poj 几道简单的搜索题 (一)

题目:poj 2488 A Knight's Journey 题意: 给一个m*n的棋盘,马走日,给出一条字典序最小的马的路线来走完整个棋盘? 分析: 如果能走完棋盘,那么从(1,1)点d...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年07月13日 16:24
  • 581

每日一搜——poj搜索题目分类

一些好题目 POJ 1190 – 生日蛋糕(基础,好题) http://acm.pku.edu.cn/JudgeOnline/problem?id=1190 题意:略 解法:dfs,题偏简单,但做出...
  • liujian20150808
  • liujian20150808
  • 2016年03月13日 19:30
  • 1178

BFS广度优先搜索(4)--hdu2717(poj3278)(基础题)

Catch That C Time Limit:2000MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu
  • Acmer_Sly
  • Acmer_Sly
  • 2016年09月13日 00:23
  • 301

谈谈对.NET开源框架Castle的认识

对.NET平台下的一个非常优秀的开源项目--Castle使用过程进行了讲解
  • quwenzhe
  • quwenzhe
  • 2015年01月29日 07:23
  • 1471

poj3278广度优先搜索(BFS)

哎,还是在看了人家的代码情况下才做出来的,没事,能学会就行啦,用的是c++上的stl中的函数,定义的队列,比C语言上自己定义好用多了,嘿嘿,poj上的题目真不简单,比其他oj要难我觉得,起码是比hdu...
  • sinat_22659021
  • sinat_22659021
  • 2014年12月12日 23:57
  • 727

POJ-1475(A*算法)

题目:http://poj.org/problem?id=1475 一眼看上去就能确定是BFS,但这题和普通寻找终点的BFS不一样,除了自身的位置,状态上还要体现箱子的位置。由于题目要求最少push...
  • uuuououlcz
  • uuuououlcz
  • 2015年01月07日 02:08
  • 1050

poj上搜索经典题目

声明: 1.这不是我原创的,是从网上找到的,跟大家分享一下。 2.后边标的难度是对于小菜而言的,像例如说applepi(杜神牛)这样的神牛除外。 3.放到这里还有一个原因是为了自己看...
  • nailerTT
  • nailerTT
  • 2015年01月08日 17:24
  • 843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【POJ】1164【搜索】【The Castle】
举报原因:
原因补充:

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