HDU 1312 Red and Black (DFS & BFS)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
题目大意:有一间矩形房屋,地上铺了红、黑两种颜色的方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动,计算你总共能够到达多少块黑色的瓷砖。
要求:输入包含多组数据,每组数据的第一行输入的是两个整数 W 和 H, 分别表示 x 方向与 y 方向上的瓷砖数量,并且 W 和 H 都不超过20。在接下来的 H 行中,每行包含 W 个字符,每个字符表示一块瓷砖的颜色,规则如下:
' . ' 代表黑色的瓷砖;
' # '代表白色的瓷砖;
' @ ' 代表黑色的瓷砖,并且你站在这块瓷砖上,该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
思路:这道题算是一道比较典型的 DFS 题,但也可以用 BFS 做出来。
代码:
DFS
#include <iostream>
#include <cstring>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
const int MAXN = 25;
int dir[2][4]={1, -1 , 0, 0, 0, 0, 1, -1};
int w, h, ans, sx, sy;
int mp[MAXN][MAXN];
char s[MAXN][MAXN];
int DFS(int x,int y){
    mp[x][y] = 1;
    for(int i=0;i<4;i++){
        int dx = x + dir[0][i];
        int dy = y + dir[1][i];
    	if (dx >= 0 && dy >= 0 && dy < w && dx < h &&
			s[dx][dy] == '.' && !mp[dx][dy]) {
			ans++;
			DFS(dx, dy);
		}
    }
    return ans;
}
int main() {
	while (scanf("%d %d", &w, &h) != EOF) {
		if (w == 0 && h == 0) break;
		clr(mp);
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				cin >> s[i][j];
				if (s[i][j] == '@') {
					sx = i;
					sy = j;
				}
			}
		}
		ans = 1;
		cout << DFS(sx, sy) << endl;
	}
    return 0;
}BFS (使用 广搜时可以把搜索过的地方用 ' # ' 进行标记)
#include <iostream>
#include <queue>
using namespace std;
const int N = 25;
int w, h, sx, sy, ans;
char s[N][N];
int d[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
struct node {
	int x, y;
};
void bfs() {
	node start, end;
	queue<node> q;
	start.x = sx;
	start.y = sy;
	q.push(start);
	while (!q.empty()) {
		start = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			end.x = start.x + d[i][0];
			end.y = start.y + d[i][1];
			if (end.x >= 0 && end.y >= 0 && end.y < w && end.x < h &&
				s[end.x][end.y] == '.' ) {
				ans++;
				s[end.x][end.y] = '#';
				q.push(end);
			}
		}
	}
}
int main() {
	while (cin >> w >> h) {
		if (w == 0 && h == 0) break;
		for (int i = 0; i < h; i++)
			for (int j = 0; j < w; j++) {
				cin >> s[i][j];
				if (s[i][j] == '@') {
					sx = i;
					sy = j;
				}
			}
		ans = 1;
		bfs();
		cout << ans << endl;
	}
	return 0;
}HDU 1312 Red and Black (DFS & BFS)的更多相关文章
- HDU 1312 Red and Black(bfs,dfs均可,个人倾向bfs)
		题目代号:HDU 1312 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/100 ... 
- HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)
		Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ... 
- HDU 1312 Red and Black(DFS,板子题,详解,零基础教你代码实现DFS)
		Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ... 
- HDU 1312 Red and Black(bfs)
		Red and Black Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descr ... 
- HDU 1312 Red and Black (DFS)
		Problem Description There is a rectangular room, covered with square tiles. Each tile is colored eit ... 
- HDU 1312 Red and Black --- 入门搜索 BFS解法
		HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ... 
- HDU 1312 Red and Black --- 入门搜索 DFS解法
		HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ... 
- HDU 1312:Red and Black(DFS搜索)
		HDU 1312:Red and Black Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & ... 
- HDU 1312 Red and Black (dfs)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Oth ... 
随机推荐
- Nginx 中 location 的匹配顺序
			nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ... 
- TypeScript 数据类型---枚举 (Enum)
			一.基础用法 1.默认值 从0开始递增+1 enum Color {Red, Green, Blue} let c: Color = Color.Red; let d: Color = Color.G ... 
- [BUUCTF]REVERSE——[ACTF新生赛2020]Oruga
			[ACTF新生赛2020]Oruga 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索字符串,根据提示来到关键函数 14行~18行就是让字符串的前5位是 actf{ ,sub_78A( ... 
- 为什么没有APS排产的MES是没有灵魂的?
			ERP系统在于对整个企业与集团企业间的全面管控,APS系统是生产规划及排程系统,MES系统重点在于车间现场的管理,下面用最简单方式讲讲ERP系统.APS系统和MES系统之间的区别与联系. 没有APS计 ... 
- Linux三剑客综合练习
			1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 [root@localhost ~]# grep -E '^[sS]' /proc/meminfo [root@loca ... 
- JAVA将Byte数组(byte[])转换成文件
			/** * 将Byte数组转换成文件 * @param bytes byte数组 * @param filePath 文件路径 如 D://test/ 最后"/"结尾 * @par ... 
- centos7安装docker,并配置镜像加速
			yum安装gcc yum -y install gcc yum -y install gcc-c++ 卸载旧版本 (没有可忽略) yum -y remove docker docker-common ... 
- 【LeetCode】54. Spiral Matrix 解题报告(Python)
			作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 维护四个边界和运动方向 保存已经走过的位置 日期 题 ... 
- 【LeetCode】143. Reorder List 解题报告(Python)
			[LeetCode]143. Reorder List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ... 
- 【LeetCode】814. Binary Tree Pruning 解题报告(Python & C++)
			作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 后序遍历 日期 题目地址:https://leetc ... 
