深搜之城堡问题

xiaoxiao2021-02-28  53

城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可

以有0~4面墙。

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

 城堡的房间数、城堡中最大房间所包括的方块数。

样例输入4711 6 11 6 3 10 67 9 6 13 5 15 51 10 12 7 13 7 513 11 10 8 10 12 13 样例输出5 91表示西墙, 2表示北墙, 4表示东墙, 8表示南墙。每个方块用代表其周围墙的数字之

和表示。

解题思路 对每一个 方块,深度优先搜索,从而给这个方块能够到达的所有位置染色。最后统计一共用了几种颜色,以及每种颜色的数量。 比如1 1 2 2 3 3 31 1 1 2 3 4 31 1 1 5 3 5 31 5 5 5 5 5 3 从而一共有5个房间,最大的房间( 1)占据9

个格子 

算是一道简单的dfs,作为萌新的我还是勉强看别人代码才敲出来的,自己写的话不一定写得出来!!!

#include<iostream》 #include<cstring> using namespace std; int r,s; //行 列 int roomnum; //房间数 int area; int a[60][60]; int b[60][60]; //标记 int maxarea; void dfs(int i,int j) { if(b[i][j]!=0) return; //这里用return 0;会报错 因为是void型 没有返回值!!! area++; b[i][j]=roomnum; if((a[i][j]&1)==0) //向左走 //==运算级大于& 没套括号答案一直不对 dfs(i,j-1); if((a[i][j]&2)==0) //向上走 dfs(i-1,j); if((a[i][j]&4)==0) // 向右走 dfs(i,j+1); if((a[i][j]&8)==0) //向下走 dfs(i+1,j); } int main() { while(cin>>r>>s) { roomnum=0; for(int i=1;i<=r;i++) { for(int j=1;j<=s;j++) { cin>>a[i][j]; } } memset(b,0,sizeof(b)); for(int i=1;i<=r;i++) { for(int j=1;j<=s;j++) { if(b[i][j]==0) { roomnum++; area=0; dfs(i,j); maxarea=max(area,maxarea); } } } cout<<roomnum<<endl; //城堡所有房间数 cout<<maxarea<<endl; //最大房间的面积 } return 1; }
转载请注明原文地址: https://www.6miu.com/read-2631366.html

最新回复(0)