一、题目

1.1题目编号:ZOJ2165

详见:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2165

1.2题目描述:

有一个长方形的房间,房间里的地面上布满了正方形的瓷砖,瓷砖要么是红色,要么是黑色。一男子站在其中一块黑色的瓷砖上。男子可以向他四周的瓷砖上移动,但不能移动到红色的瓷砖上,只能在黑色的瓷砖上移动。

本题的目的就是要编写程序,计算他在这个房间里可以到达的黑色瓷砖的数量。

1.3输入描述

输入文件中包含多个测试数据。每个测试数据的第1 行为两个整数W和H,分别表示长方形房间里x方向和y方向上瓷砖的数目。W和H的值不超过20。接下来有H 行,每行有W个字符,每个字符代表了瓷砖的颜色,这些字符的取值及含义为:

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

2) '#' - 红色的瓷砖;

3) '@' - 表示该位置为黑色瓷砖,且一名男子站在上面,注意每个测试数据中只有一个

'@'符号。

输入文件中最后一行为两个0,代表输入文件结束。

1.4 输出描述

对输入文件中每个测试数据,输出占一行,为该男子从初始位置出发可以到达的黑色瓷砖的数目(包括他初始时所处的黑色瓷砖)。样例如下:

二、思路

由于需要求解的是从当前位置可以达到的所有黑色瓷砖的数量,显然可以利用深度搜索实现。解法比较直观,可以作为一个比较典型的DFS案例。

通过递归实现DFS的关键在于1)判定退出条件,2)施行必要的剪枝,3)确认是否需要在进入下一级递归前,从递归返回时执行必要的调整

本题比较简单,Mr. Pospro将结合代码注释进行必要的解释。

三、解答

/*
红与黑(Red and Black), ZOJ2165, POJ1979
2016.05.18 Wed Sunny by Pospro
详见博客 http://blog.csdn.net/pospro
*/
#include <cstdio>
#include <cstring>
#define MAXN 22int N; //rows
int M; //columns
int cnt; //the number of ceramics he can reach;
char map[MAXN][MAXN];
int fx[8]={-1,0,0,1,1,0,0,-1}; //两个作为一组,分别表示上右下左四个方向void DFS(int x, int y)
{int nextx, nexty;int i,j;map[x][y]='*'; //先把当前格设为已访问过for(i=0;i<8;i=i+2) //按照上右下左的顺序,朝四个方向尝试{nextx=x+fx[i];nexty=y+fx[i+1];if(nextx<0||nextx>=N||nexty<0||nexty>=M||map[nextx][nexty]!='.')continue; //满足以上任一个条件,则说明此路不通,换方向再试试吧cnt++; //如果到达这里,则说明此处也是黑瓷砖,计数加1,并启动新的搜索DFS(nextx, nexty);}
}int main()
{int i,j;int startx, starty; //开始位置,即@所在位置while(1){scanf("%d%d",&M, &N); //注意审题,题目的输入是先列后行!if(M==0&&N==0)break;cnt=1; //新开始,重新置1memset(map,0,sizeof(map)); //清空地图for(i=0;i<N;i++) //接收输入并找到起始位置{scanf("%s",map[i]);for(j=0;j<M;j++){if(map[i][j]=='@'){startx=i;starty=j;}}}DFS(startx,starty); //启动深度搜索printf("%d\n",cnt);}return 0;
}


“Red and Black(红黑瓷砖),ZOJ2165”的一种解法相关推荐

  1. 红黑瓷砖--dfs求解

    有一个矩形房间,覆盖正方形瓷砖.每块瓷砖涂成了红色或者黑色.一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一.但是他不能移到红砖上,只能移动到黑砖上.编写一个程序,计算通过重复上述移动所能 ...

  2. 初探_红黑(Red-black)树

    红黑树 红黑(Red-black)树 ​ 是一种自平衡二叉查找树,1972年由Rudolf Bayer发明,它与AVL树类似,都在插入和删除操作时能通过旋转操作保持二叉查找树的平衡,以便能获得高效的查 ...

  3. PHP红黑源码,红黑树的实现源码(第二次修订版)

    /*----------------------------------------------------------- RB-Tree的插入和删除操作的实现算法 参考资料: 1) <> ...

  4. [数据结构与算法]RED-BLACK(红黑)树的实现TreeMap源码阅读

    由于平衡二叉树与红黑树都是二叉排序树,又红黑树是对平衡二叉树的一种改进实现,所以它的很多思想算法都来源于排序二叉或平衡二叉树,比如排序二叉树中的添加.删除.查找及查找直接后继节点等,平衡二叉树中的左旋 ...

  5. 图解红黑树及Java进行红黑二叉树遍历的方法

    红黑树 红黑树是一种数据结构与算法课堂上常常提到但又不会细讲的树,也是技术面试中经常被问到的树,然而无论是书上还是网上的资料,通常都比较刻板难以理解,能不能一种比较直观的方式来理解红黑树呢?本文将以图 ...

  6. javascript解决问题:红白球共25个,白黑球共31个,红黑球共28个,求三种球各有多少?求红白黑球的个数;

    前端入门学习遇到的问题: 刚刚学习了js中的两个循环语句for和while,因为几天前就接触了for循环,自己用起来更加顺手,今天找了几道入门的编程问题,其中有一道遇到了问题,题目如下: 红白球共25 ...

  7. JS有红,白,黑三球若干个,其中红,白球共25个,白黑共31个,红黑共28个,求三种球各多少个。

    题目: 有红,白,黑三球若干个,其中红,白球共25个,白黑共31个,红黑共28个,求三种球各多少个. 小白学js,嘤嘤嘤! 刚开始看这道题,我xx居然去傻傻去解方程,666!(要我动脑,我还要计算机干 ...

  8. java容器之七_TreeMap与红黑二叉树

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  9. 详解c++---红黑二叉树的原理和实现

    目录标题 什么是红黑二叉树树 红黑树的性质 红黑树的效率分析 红黑树的准备工作 红黑树的insert函数 节点的调整 情况一 情况二 情况三 转换的实现 打印函数 find函数 检查函数 什么是红黑二 ...

最新文章

  1. Windows安全策略
  2. 【译】Getting Started With Ethereum and Building a Basic Dapp — Part 2
  3. bitmap xml大小 安卓_一张壁纸让安卓用户手机系统崩溃,包括三星、小米、一加等...
  4. 局域共享解决——用户账户限制,可能的原因包括不允许空密码,登录时间限制...
  5. 王者体验服服务器注册人数已满,王者官方大厅奖励有多难获得?服务器直接崩溃,玩家:别发红包了...
  6. php怎么选择路径,利用php+mcDropdown实现文件路径可在下拉框选择
  7. WCF光芒下的Web Service
  8. close wait 过多原因_从Linux源码看TIME_WAIT状态的持续时间
  9. 【CTF】关于md5总结
  10. Leetcode——最长公共子序列 / 最长公共子串
  11. 计算3个地理坐标点之间的夹角
  12. python程序设计入门书籍推荐_python刚刚入门,接下来这几本python的书会让你成为别人眼里的大神!...
  13. 命令行提示符参数PS1, 但是不会自动换行
  14. 全志VR9虚拟现实专用芯片处理器介绍
  15. UFCS 移动终端融合快速充电说明 一 物理层特性
  16. AJAX技术学院风连衣裙,清新又减龄学院风连衣裙,轻松穿出少女感
  17. 简单字符驱动笔记(朱有鹏)
  18. Kingbase金仓数据库学习小记
  19. 低代码开发流程是怎么样的?
  20. 在logopond中看到的优秀设计随想

热门文章

  1. Office 365入门教程(一):开始使用Office 365
  2. 网上银行系统信息安全通用规范【学习笔记】
  3. 继续谈下脑残的NODE_MODULE_VERSION,全世界冷眼看着electron
  4. Python+PIL 轻松制作九宫格图片
  5. win10内存占用率过高怎么办_DNF:WIN10玩DNF卡顿,内存占用过高的解决方法
  6. 删除微信文件服务器,局域网微信存储空间怎么清理
  7. C#:在一个窗体类中改变另一个窗体控件的属性
  8. dns找不到服务器,“找不到服务器或DNS错误”,如何调整?
  9. poj 1013 模拟 天平问题
  10. Debian修改桌面系统