搜索篇主要介绍深搜、广搜、剪枝和A*算法,下面通过具体的题目进行一一呈现。
Q1(Problem source : 百练2815):
描述
请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成m?n(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 分析:很典型的dfs问题,数据规模不大也不会用到剪枝,这里需要注意的一个运算符优先级的小细节是用位运算符&和==运算符的时候,前面的位运算符要加小括号。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 51; int Map[maxn][maxn]; int visit[maxn][maxn]; int m , n; int dfs(int i , int j) { int num = 1; visit[i][j] = 1; if((Map[i][j] & 1) == 0 && j - 1 >= 1 && visit[i][j-1] == 0) { num += dfs(i,j-1); } if((Map[i][j] & 2) == 0 && i - 1 >= 1 && visit[i-1][j] == 0) { num += dfs(i-1,j); } if((Map[i][j] & 4) == 0 && j + 1 <= n && visit[i][j+1] == 0) { num += dfs(i,j+1); } if((Map[i][j] & 8) == 0 && i + 1 <= m && visit[i+1][j] == 0) { num += dfs(i+1,j); } return num; } int main() { while(scanf("%d",&m) != EOF) { scanf("%d",&n); for(int i = 1;i <= m;i++) for(int j = 1;j <= n;j++) scanf("%d",&Map[i][j]); memset(visit , 0 , sizeof(visit)); int num = 0; int Max = 0; // printf("%d ",dfs(1,1)); for(int i = 1;i <= m;i++) for(int j = 1;j <= n;j++) { if(visit[i][j] == 0) { num++; Max = max(Max , dfs(i,j)); } else continue; } printf("%d\n%d\n",num,Max); } }
时间: 2024-10-08 13:12:05