将问题的各状态之间的转移关系描述
为一个图,则深度优先搜索遍历整个图的
框架为:
Dfs(v) {
if( v 访问过)
return;
将v标记为访问过;
对和v相邻的每个点u: Dfs(u);
}
int main() {
while(在图中能找到未访问过的点 k)
Dfs(k);
}

4
例题:百练2815 城堡问题
 右图是一个城堡的地形图
。请你编写一个程序,计
算城堡一共有多少房间,
最大的房间有多大。城堡
被分割成m×n(m≤50,
n≤50)个方块,每个方块可
以有0~4面墙。
5
输入输出
 输入
 程序从标准输入设备读入数据。
 第一行是两个整数,分别是南北向、东西向的方块数。
 在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数
字表示方块周围的墙, 1表示西墙, 2表示北墙, 4表示东墙, 8表示南
墙。 每个方块用代表其周围墙的数字之和表示。 城堡的内墙被计算两
次,方块(1,1)的南墙同时也是方块(2,1)的北墙。
 输入的数据保证城堡至少有两个房间。
 输出
 城堡的房间数、城堡中最大房间所包括的方块数。
 结果显示在标准输出设备上。
6
 样例输入
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表示西墙, 2表示北墙, 4表示东墙, 8表
示南墙。每个方块用代表其周围墙的数字之
和表示。
7
解题思路
 对每一个 方块,深度优先搜索,从而给这个方
块能够到达的所有位置染色。最后统计一共用
了几种颜色,以及每种颜色的数量。
 比如
1 1 2 2 3 3 3
1 1 1 2 3 4 3
1 1 1 5 3 5 3
1 5 5 5 5 5 3
 从而一共有5个房间,最大的房间( 1)占据9
个格子
8

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int R,C;//行数和列数
int rooms[60][60];//房间的标号(这里都是从1开始的)
int color[60][60];//标记房间是否染过色
int maxRoomArea = 0;//这里是指最大的房间面积(几个格子)
int	roomNum = 0;//房间号
int roomArea;//在一次深搜的过程中,所能达到面积(在渐变的一个变量)

//深搜的函数
void Dfs(int i,int k)
{
	if(color[i][k])
		return;
	++roomArea;
	color[i][k]=roomNum;
	if( (rooms[i][k] & 1) == 0 ) Dfs(i,k-1); //向西走
	if( (rooms[i][k] & 2) == 0 ) Dfs(i-1,k); //向北
	if( (rooms[i][k] & 4) == 0 ) Dfs(i,k+1); //向东
	if( (rooms[i][k] & 8) == 0 ) Dfs(i+1,k); //向南
}

int main()
{
	cin>>R>>C;
	for(int i=1;i<=1;i++)
		for(int k=1;k<=1;k++)
			cin>>rooms[i][k];
	memset(color,0,sizeof(color));
	for( int i = 1;i <= R; ++i)
		for( int k = 1; k <= C; ++ k)
		{
			if( !color[i][k] )
			{
				++roomNum ;
				roomArea = 0;
				Dfs(i,k);
				maxRoomArea = max(roomArea,maxRoomArea);
			}
		}
		cout << roomNum << endl;
		cout << maxRoomArea << endl;
	system("pause");
	return 1;
}

void Dfs(int r,int c) { //不用递归,用栈解决,程序其他部分不变
	struct Room {
		int r,c;
		Room(int rr,int cc):r(rr),c(cc) { }
	};
	stack<Room> stk;
	stk.push(Room(r,c));
	while ( !stk.empty() ) {
		Room rm = stk.top();
		int i = rm.r; int k = rm.c;
		if( color[i][k]) stk.pop();
		else {
			++ roomArea;
			color [i][k] = roomNum;
			if( (rooms[i][k] & 1) == 0 ) stk.push(Room(i,k-1)); //向西走
			if( (rooms[i][k] & 2) == 0 ) stk.push(Room(i-1,k)); //向北
			if( (rooms[i][k] & 4) == 0 ) stk.push(Room(i,k+1)); //向东
			if( (rooms[i][k] & 8) == 0 ) stk.push(Room(i+1,k)); //向南
		}
	}
}

  

castle problem——(深度优先搜索,递归实现和stack实现)的更多相关文章

  1. C/C++深度优先搜索(递归树模拟)

    //C++深度优先搜索(递归树模拟) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #define MAX_N 1000 usin ...

  2. 图的深度优先搜索dfs

    图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...

  3. 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

    将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...

  4. 【11】python 递归,深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...

  5. Anagrams by Stack(深度优先搜索)

    ZOJ Problem Set - 1004 Anagrams by Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB How can a ...

  6. python 递归深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件2.找出这一次和上一次关系3.假设当前 ...

  7. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  8. python 递归,深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...

  9. Generate parentheses,生成括号对,递归,深度优先搜索。

    问题描述:给n对括号,生成所有合理的括号对.比如n=2,(()),()() 算法思路:利用深度优先搜索的递归思想,对n进行深度优先搜索.边界条件是n==0:前面电话号组成字符串也是利用dfs. pub ...

随机推荐

  1. 【学习笔记】二:在HTML中使用JavaScript

    1.<script>标签 1)考虑到最大限度的浏览器兼容性和约定俗成,type属性使用:text/javascript. 2)标签建议放置到</body>标签前,提高用户体验( ...

  2. requirejs&&springboot

    1.Spring Boot Spring boot 基础结构主要有三个文件夹: (1)src/main/java  程序开发以及主程序入口 (2)src/main/resources 配置文件 (3) ...

  3. python中 import 和from ... import 的区别

    先看一个例子: 我自定义的一个moudle,里面有一个方法sayhi,还有一个变量version#!/usr/bin/env python # coding=utf-8 # Filename: mym ...

  4. javaee 第七周作业

    一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...

  5. Python3简明教程(十二)—— 模块

    在这节我们将要学习 Python 模块相关知识.包括模块的概念和导入方法,包的概念和使用,第三方模块的介绍,命令行参数的使用等. 模块 到目前为止,我们在 Python 解释器中写的所有代码都在我们退 ...

  6. TensorFlow低阶API(四)—— 图和会话

    简介 TensorFlow使用数据流图将计算表示为独立的指令之间的依赖关系.这可生成低级别的编程模型,在该模型中,您首先定义数据流图,然后创建TensorFlow会话,以便在一组本地和远程设备上运行图 ...

  7. 在.vue文件中让html代码自动补全的方法(支持vscode)

    在.vue文件中让html代码自动补全的方法(支持vscode) https://blog.csdn.net/qq_36529459/article/details/79196763 "fi ...

  8. Spring JDBC 例子

    http://www.yiibai.com/spring/spring_jdbc_example.html 要了解有关Spring JDBC框架与JdbcTemplate类的概念,让我们写这将实现所有 ...

  9. 去除ie下select框箭头

    select::-ms-expand { display: none;}兼容ie10及以上

  10. Linux 系统内存分析

    1. 内存基本介绍 1.计算机基本结构: 电脑之父--冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器 如图: 输入设备:键盘鼠标等 CPU:是计算机的运算核心和控制核心, ...