城堡问题

原题目链接:

NOI题库  166:The Castle   链接:http://noi.openjudge.cn/ch0205/166/    来源:IOI1994

NOI题库  1817:城堡问题    链接:http://noi.openjudge.cn/ch0205/1817/

问题描述

一座城堡被分为m*n个方块,其中m≤50,n≤50,每个方块可有0~4堵墙围在周围(0表示没有墙壁)。下面是一个城堡的示意图:

图中的加粗黑线表示墙壁。几个连通的方块组成房间,房间与房间之间一定是用墙壁(粗黑线)隔开的。

现在要编程求解两个问题:1、该城堡有多少个房间?   2、最大房间有多少个方块?

输入格式:

程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤15)描述:用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间。

输出格式:

城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。

输入样例:

4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13 

输出样例:

5
9

算法分析:

这个题目用深搜或广搜都可以解决。其实类似于统计水洼数目的这一道题:http://www.cnblogs.com/huashanqingzhu/p/7258841.html

下面分别用广搜和深搜来解决:

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<queue>
  4 #include<stack>
  5 using namespace std;
  6
  7 struct obj
  8 {
  9     int xx,yy;
 10 };
 11
 12 int m,n;
 13 int a[52][52]={0};//a[i][j]用来保存(i,j)位置的方块周围的墙壁信息。
 14 int b[52][52]={0};//b[i][j]用来标识(i,j)位置的方块是否在搜索过程中被访问过
 15 int Count,Max;
 16
 17 int dx[4]={0,-1,0,1};//左上右下
 18 int dy[4]={-1,0,1,0};
 19 int bitCheck[4]={1,2,4,8};//西、北、东、南各边的墙壁对应的数字
 20 void BFS(int x,int y);//从(x,y)开始广搜
 21 void DFS(int x,int y);//从(x,y)开始深搜
 22 void DFS2(int x,int y);//从(x,y)开始深搜,递归实现
 23 int CNum=0;//用于DFS2(),记录正在搜索的某个房间的方块数目
 24
 25 int main(int argc, char *argv[])
 26 {
 27     freopen("1817.in","r",stdin);
 28     int i,j;
 29     int t;
 30
 31     scanf("%d%d",&m,&n);
 32     for(i=0;i<m;i++)
 33     {
 34         for(j=0;j<n;j++)
 35         {
 36             scanf("%d",&a[i][j]);
 37             //printf("%2d ",a[i][j]);
 38         }
 39         //printf("\n");
 40     }
 41
 42     Count=0;
 43     Max=-1;
 44     for(i=0;i<m;i++)
 45     {
 46         for(j=0;j<n;j++)
 47         {
 48             if(b[i][j]==0)//(i,j)这个位置的方块未曾被搜索访问
 49             {
 50                 //BFS(i,j);
 51                 DFS(i,j);
 52                 //{ CNum=0; DFS2(i,j); Count++; if(CNum>Max) Max=CNum; }
 53             }
 54         }
 55     }
 56     printf("%d\n%d\n",Count,Max);
 57     return 0;
 58 }
 59
 60 void BFS(int x,int y)//从(x,y)开始广搜
 61 {
 62     queue<struct obj> q;
 63     struct obj start,temp;
 64     int i,txx,tyy;
 65     int num=0;//正在搜索的这个房间的方块数目
 66
 67     start.xx=x;
 68     start.yy=y;
 69     q.push(start);
 70     b[x][y]=1;
 71     num=1;
 72     while(!q.empty())
 73     {
 74         for(i=0;i<4;i++)
 75         {
 76             txx=q.front().xx+dx[i];
 77             tyy=q.front().yy+dy[i];
 78             //不越界,没有墙壁,未曾访问过,三个条件都满足才可以访问
 79             if(txx>=0&&txx<m&&tyy>=0&&tyy<n&&((a[q.front().xx][q.front().yy]&bitCheck[i])==0)&&b[txx][tyy]==0)
 80             {
 81                 temp.xx=txx;
 82                 temp.yy=tyy;
 83                 b[txx][tyy]=1;
 84                 q.push(temp);
 85                 num++;
 86             }
 87         }
 88         q.pop();
 89     }
 90     Count++;
 91     if(num>Max) Max=num;
 92 }
 93
 94 void DFS(int x,int y)//从(x,y)开始深搜
 95 {
 96     stack<struct obj> s;
 97     struct obj start,temp,temp2;
 98     int i,txx,tyy;
 99     int num;//正在搜索的这个房间的方块数目
100
101     b[x][y]=1;
102     start.xx=x;
103     start.yy=y;
104     s.push(start);
105     num=1;
106     while(!s.empty())
107     {
108         temp=s.top();  s.pop();
109         for(i=0;i<4;i++)
110         {
111             txx=temp.xx+dx[i];
112             tyy=temp.yy+dy[i];
113             //不越界,没有墙壁,未曾访问过,三个条件都满足才可以访问
114             if(txx>=0&&txx<m&&tyy>=0&&tyy<n&&((a[temp.xx][temp.yy]&bitCheck[i])==0)&&b[txx][tyy]==0)
115             {
116                 temp2.xx=txx;
117                 temp2.yy=tyy;
118                 b[txx][tyy]=1;
119                 s.push(temp2);
120                 num++;
121             }
122         }
123     }
124     Count++;
125     if(num>Max) Max=num;
126 }
127
128 void DFS2(int x,int y)//从(x,y)开始深搜,递归实现.返回正在搜索的这个房间的方块数目
129 {
130     int i,txx,tyy;
131
132     b[x][y]=1;
133     CNum++;
134     for(i=0;i<4;i++)
135     {
136         txx=x+dx[i];
137         tyy=y+dy[i];
138         //不越界,没有墙壁,未曾访问过,三个条件都满足才可以访问
139         if(txx>=0&&txx<m&&tyy>=0&&tyy<n&&((a[x][y]&bitCheck[i])==0)&&b[txx][tyy]==0)
140         {
141             //b[txx][tyy]=1;
142             DFS2(txx,tyy);
143         }
144     }
145 }
时间: 2024-10-05 03:01:59

城堡问题的相关文章

洛谷P1457 城堡 The Castle

P1457 城堡 The Castle 137通过 279提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票).结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡! 喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关

迷宫城堡 -- 强联通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10908    Accepted Submission(s): 4887 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdoj 1269 迷宫城堡【scc基础题目】

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10156    Accepted Submission(s): 4570 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

星星城堡童装加盟固件

啊?年轻的姑娘越发疑惑了,不由得愣愣的看着他,剑也微微歪到了一边.看来他不是宋人也不是辽人,要不然也不敢说什么什么的宋人辽人了.难道他是女真人?那"狗屁"二字,让她想着就脸红.她暗暗恼怒,却又发作不得. 哪来的这么俏丽的姑娘?徐可暗自吞了一口口水,眼睛一眨不眨的盯着姑娘的胸部猛睢.呸!这年轻俏丽的姑娘脸上一红,暗暗恼怒,却不敢发作.缓缓走到床前,伸出两根纤纤玉指,搭在徐可的手腕上.徐可嘿嘿一笑,觉得身上也不怎么痛了,见那两根有妈妈信赖白玉脂滑的手指轻轻的震动着,心中一荡,使劲大大吸了一

星星城堡童装加盟洋葱

他们露营的地方距高速公路两三公里,星星城堡童装,望远镜可以看到来往车辆的. "嗯,绝望时的惊叫,可能有人遇险." "哦--"李敏突然说道:"队长,咱们是不是应该呆在这儿原地等待啊?以前的书上网上电影上说的都是穿越到哪儿还能从哪儿回去的." "张迪,张迪,请回话." "队长!快看,下边的嘉峪关不见了!" "还是开着吧,也许就在附近,他们可能需要帮助的." 随着对讲机里传出几个人的惊叫声一道

hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法

hdu1269 迷宫城堡 验证给出的有向图是不是强连通图... Tarjan算法板子题 Tarjan算法的基础是DFS,对于每个节点.每条边都搜索一次,时间复杂度为O(V+E). 算法步骤: 1.搜索到某一个点时,将该点的Low值标上时间戳,然后将自己作为所在强连通分量的根节点(就是赋值Dfn=Low=time) 2.将该点压入栈. 3.当点p有与点p'相连时,如果此时p'不在栈中,p的low值为两点的low值中较小的一个. 4.当点p有与点p'相连时,如果此时p'在栈中,p的low值为p的lo

hdu 1269 迷宫城堡 强连通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12778    Accepted Submission(s): 5698 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu 1269 迷宫城堡

迷宫城堡 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 29   Accepted Submission(s) : 12 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房

hdu 1269 迷宫城堡 最简单的联通图题 缩点算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你

hdu 1269 迷宫城堡(Targin算法)

---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Swwubmission(s): 10884    Accepted Submission(s): 4878 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单