转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8413547.html
2815:城堡问题
总时间限制: 1000ms 内存限制: 65536kB
1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---# 4 # # | | | | # # ############################# (图 1) # = Wall | = No wall - = No wall
图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
输入
程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,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
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a[100][100];//存储房间信息 5 int color[100][100]={0};//对遍历过的房间进行染色 6 int numroom=0, maxarea=0;//房间数目和最大房间面积 7 int roomarea;//房间面积 8 void dfs(int x, int y) 9 { 10 if(color[x][y]!=0) return;//如果访问过,直接返回 11 color[x][y]=numroom;//对当前方格染色当前房间编号的色 12 roomarea++;//如果没访问过,房间面积加一 13 if((a[x][y]&1)==0) dfs(x,y-1);//西边没墙,向西深搜 14 if((a[x][y]&2)==0) dfs(x-1,y);//与上个语句相似 15 if((a[x][y]&4)==0) dfs(x,y+1); 16 if((a[x][y]&8)==0) dfs(x+1,y); 17 } 18 19 int main() 20 { 21 int n,m; 22 cin>>n>>m; 23 for(int i=0; i<n; i++) 24 { 25 for(int j=0; j<m; j++) 26 { 27 cin>>a[i][j]; 28 } 29 }//读入房间信息 30 for(int i=0; i<n; i++)//对所有方格进行遍历 31 { 32 for(int j=0; j<m; j++) 33 { 34 if(color[i][j]==0)//如果方格没有访问过,那么就是一个新的房间开始 35 { 36 numroom++; 37 roomarea=0; 38 dfs(i,j); 39 maxarea=max(maxarea,roomarea); 40 } 41 42 } 43 } 44 cout<<numroom<<endl<<maxarea; 45 }