深度搜索

走地图的题目是深度搜索里比较容易理解的题目,更深层次的是全排列和七皇后等经典题目,更加难以理解,代码比较抽象。

题目:红与黑

蒜厂有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。WW 和 HH 都不超过 2020。

在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)'.':黑色的瓷砖;

2)'#':白色的瓷砖;

3)'@':黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

输出格式

输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

6 9

....#.

.....#

......

......

......

......

......

@...#

.#..#.

样例输出

45

AC代码

<font size=4 face="微软雅黑">#include <cstdio>
#include <iostream>
using namespace std;
int n,m;
int step=0;//代表到达黑色瓷砖的块数
char maze[30][30];
bool vis[30][30];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//代表上下左右四个方向
//判断数组是否越界
bool in(int x,int y)
{
return 0<=x&&x<n&&0<=y&&y<m;
}
void dfs(int x,int y)
{
step++;
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int tx=x+dir[i][0];//x的变化
int ty=y+dir[i][1];
if(!vis[tx][ty]&&maze[tx][ty]=='.'&&in(tx,ty))
{
dfs(tx,ty);
}
}
}
int main()
{ cin>>m>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>maze[i][j];
}
}
int x,y;
//寻找@的位置
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(maze[i][j]=='@')
{
x=i;
y=j;
}
}
}
dfs(x,y);
cout<<step;
return 0;
}

代码理解

编写代码主要遇到的问题是如何让程序自己进行“行走”,因此我编辑代码

int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int tx=x+dir[i][0];
int ty=y+dir[i][1];

成为配套程序让程序自己进行“行走”。在“行走”的函数中这连个代码会帮助程序进行计数和行走,计数则需要加一个

step++;

行走在地图上首要考虑的是越界相关的问题,这时候就需要一个判定函数,该函数应该对重复路线,碰壁,范围进行判定,既是

bool in(int x,int y)
{
return 0<=x&&x<n&&0<=y&&y<m;
}

若return不成立则返回false,若成立则返回ture,与该函数进行匹配的程序是

vis[x][y]=true;
if(!vis[tx][ty]&&maze[tx][ty]=='.'&&in(tx,ty));

递归函数可以让程序自己不停的“行走”,直到完成整个运行输出step

随机推荐

  1. 【bzoj2823】 AHOI2012—信号塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...

  2. dbcp写连接池 Demo

    1.导包 2.准备配置文件   .properties(注:这里的参数名driverClassName.url.username等是不能改变的) 不能任意命名的原因是[你懂得] 3.Demo publ ...

  3. YUI的类型判断函数

    1.首先定义一个关于类型的对象,及相关变量 类型判断对象 ar L = Y.Lang || (Y.Lang = {}), STRING_PROTO = String.prototype, TOSTRI ...

  4. JavaScript看书笔记01

    JavaScript看书笔记... ------------------- JavaScript允许var定义语句出现在函数内部的任意位置.JS中使用Var来显示的给变量声明 JavaScript是一 ...

  5. ABAP基础一:ALV基础之ALV的整体结构

    很久没摸ECC了,最近看到很多新人在捯饬ALV...中国就喜欢量产垃圾...培训,上岗...没有行业道德... 闲话不多说,开始正事: ALV很常见,在SAP非WEB的项目,没有不用的,它包含了报表和 ...

  6. 【译】第40节---EF6-命令监听

    原文:http://www.entityframeworktutorial.net/entityframework6/database-command-interception.aspx 本节,将学习 ...

  7. [jQ]jQuery显式操作Checkbox,并用数组存储关联值的方案

    ---------------------------------------------------------------------------------------------------- ...

  8. [SQL Server] 复制数据库任务

    假设你要生产环境下的数据做相应的测试,比如修改及测试存储过程.更改和优化索引等.但是你用户在连接数据库的情况下,你又不能断开数据库的连接.如何取得数据库的副本呢? 一.  利用数据库任务中的复制数据库 ...

  9. UVa 10163 仓库守卫

    https://vjudge.net/problem/UVA-10163 题意: 有n个仓库,m个管理员,每个管理员有一个能力值P(接下来的一行有m个数,表示每个管理员的能力值) 每个仓库只能由一个管 ...

  10. PostgreSQL 连接的问题

    一.在postgresql的安装文件夹\8.3\data\pg_hba.conf里面(或者在开始菜单程序下面的postgresql的配置文档)找到“# IPv4 local connections:” ...