Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6348 | Accepted: 3592 |
Description
1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---# 4 # # | | | | # # ############################# (Figure 1) # = Wall | = No wall - = No wall
Figure 1 shows the map of a castle.Write a program that calculates
1. how many rooms the castle has
2. how big the largest room is
The castle is divided into m * n (m<=50, n<=50) square modules. Each such module can have between zero and four walls.
Input
Output
Sample Input
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
Sample Output
5 9
//POJ 1164
#include <stdio.h>
int r, c, p[50][50], rooms, max, modules;
//r,c:南北向、东西向的方块数
//p[50][50]:输入的每个方块的数字
//rooms:城堡的房间数
//max:最大房间的面积
//modules:当前房间的面积
bool visit[50][50]; //标识房间是否被访问过
void markRoom(int x,int y);//搜寻与(x,y)属于同一房间的方块
int main()
{
while(scanf("%d %d",&r,&c)==2) //南北向,东西向的方块数
{
rooms=max=0; //初始化房间数和最大房间的面积
int i,j;
for(i=0;i<r;i++) for(j=0;j<c;j++)
{
scanf("%d",&p[i][j]);
visit[i][j]=0; //输入每个房间的墙数,并且将本房间初始化为0(bool)
}
for(i=0;i<r;i++) for(j=0;j<c;j++)
{
modules=0;
markRoom(i,j);
if(modules!=0)
rooms++;
if(modules>max)
max=modules;
}
printf("%d\n%d\n",rooms,max);
}
return 0;
}
void markRoom(int x,int y)
{
if(visit[x][y]) return;
else
{
visit[x][y]=1;
modules++;
}
if ( p[x][y]<8 ) markRoom(x+1, y); //按照下面的注释一步一步找
else p[x][y] = p[x][y]%8;
if ( p[x][y]<4 ) markRoom(x, y+1);
else p[x][y] = p[x][y]%4;
if ( p[x][y]<2 ) markRoom(x-1, y);
else p[x][y] = p[x][y]%2;
if ( p[x][y]==0 ) markRoom(x, y-1);
}
/*
p<8
(i,j)没有南墙,(i+1,j)与(i,j)属于同一房间
所有与(i+1,j) 属于同一房间的方块也与(i,j)属于同一房间
p%8<4
(i,j)没有东墙, (i,j+1)与(i,j)属于同一房间
所有与(i,j+1)属于同一房间的方块也与(i,j)属于同一房间
p%4<2
(i,j) 没有北墙 ,(i-1,j)与(i,j)属于同一房间
所有与(i-1,j)属于同一房间的方块也与(i,j)属于同一房间
p%2=0
(i,j)没有西墙,(i,j-1)与(i,j)属于同一房间
所有与(i,j-1)属于同一房间的方块也与(i,j)属于同一房间
*/