将问题的各状态之间的转移关系描述
为一个图,则深度优先搜索遍历整个图的
框架为:
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. 数据库SQL server 删除一张表中的重复记录

    --建立一张表 create table cat( catId int, catName varchar(40) ) --将下边的插入语句,多执行几次. insert into catvalues(1 ...

  2. 杨辉三角python的最佳实现方式,牛的不能再牛了

    def triangles(): N = [1] while True: yield N N.append(0) N = [N[i-1] + N[i] for i in range(len(N))] ...

  3. sql语句分为三类(DML,DDL,DCL)-介绍

    本文知识来源自:<Oracle专家高级编程> 分享作者:Vashon 时间:20150415 DDL is Data Definition Language statements. Som ...

  4. Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用

    1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...

  5. mac上的应用提权

    一个mac上的app需要在/Applications/My.app/Contents/MacOS路径下创建一个配置文件,在开启root权限的账户下运行时ok,但是在没有开启root权限的账户下运行时, ...

  6. android 代码中及xml中设置透明

    在布局文件的属性中,比如要设置一个LineaerLayout的背景为灰色透明.首先查RGB颜色表灰色是:#9E9E9E,AA代表透明,(透明度从00到FF,00表示完全透明),所以,设置其属性:and ...

  7. 如何安装Virtual Box的VBox Guest Additions扩展程序

    Virtual Box的默认安装是不包含Guest Addition这个扩展的,在实际使用过程中带来种种不便,比如只能通过小窗口访问虚拟机的操作系统,通过默认的右Ctrl切换鼠标,不能和宿主操作系统共 ...

  8. 进程池_Pool

    当需要创建子进程数量不多的时候,可以直接利用multiprocessing中的Process动态生成多个进程 但是如果是成百甚至上千个任务,手动地创建它的工作量很大,此时就可以利用到multiproc ...

  9. sysUpload.vue上传组件 的时候 看进度的时候 不要mock 注释掉 // if (process.env.NODE_ENV !== 'production') require('@/mock')

    上传组件 的时候 看进度的时候 不要mock 注释掉 // if (process.env.NODE_ENV !== 'production') require('@/mock') <!-- * ...

  10. python3查询Excel中A表在B表没有的数据,并保存到新的Excel,这里用的是“xlrd”和“xlwt”

    import xlrd import xlwt # 打开A表,将A表的数据存放到cols1中,这里打印出来是方便查看测试数据. data1 = xlrd.open_workbook(r'F:\cars ...