Red and Black

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8435    Accepted Submission(s): 5248

Problem Description
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.

 
Input
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

'.' - a black tile 
'#' - a red tile 
'@' - a man on a black tile(appears exactly once in a data set) 

 
Output
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself). 
 
Sample Input
....#.
.....#
......
......
......
......
......
#@...#
.#..#. .#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
........... ..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#.. ..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
Sample Output
45
59
6
13
 
Source
 
Recommend
Eddy   |   We have carefully selected several similar problems for you:  1372 1242 1240 1072 1258 

 
  DFS搜索,入门题
  规定地图中有可通行的位置,也有不可通行的位置,已知起点,求一个连通分量。说白了就是求一个点的与它相连的部分。在这道题里输出相连的位置的数目。
  思路是从起点开始,遍历每一个到达的点的四个方向,到达一个位置就将这个位置的字符变成不可走的'#',并且计数+1。其实就是计数将可走变成不可走的操作进行了多少次。
  代码一
 #include <iostream>
using namespace std;
int cnt;
char a[][];
int n,m;
int dx[] = {,,,-}; //方向
int dy[] = {,,-,};
bool judge(int x,int y)
{
if(x< || x>n || y< || y>m)
return ;
if(a[x][y]=='#')
return ;
return ;
}
void dfs(int cx,int cy)
{
cnt++;
a[cx][cy] = '#';
int i;
for(i=;i<;i++){
int nx = cx + dx[i];
int ny = cy + dy[i];
if(judge(nx,ny))
continue;
//可以走
dfs(nx,ny);
}
}
int main()
{
while(cin>>m>>n){
if(n== && m==) break;
int i,j;
int x,y;
for(i=;i<=n;i++)
for(j=;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='@') //记录开始的位置
x=i,y=j;
}
cnt = ;
dfs(x,y);
cout<<cnt<<endl;
}
return ;
}
   这种方法直接返回结果,两种不同的写法,代码二
 #include <iostream>
using namespace std;
char a[][];
int n,m;
int dx[] = {,,,-}; //方向
int dy[] = {,,-,};
bool judge(int x,int y)
{
if(x< || x>n || y< || y>m)
return ;
if(a[x][y]=='#')
return ;
return ;
}
int dfs(int cx,int cy)
{
int i,sum=;
a[cx][cy] = '#'; //走过的这一步覆盖
for(i=;i<;i++){
int nx = cx + dx[i];
int ny = cy + dy[i];
if(judge(nx,ny))
continue;
//可以走
sum+=dfs(nx,ny);
}
return sum==?:sum+;
}
int main()
{
while(cin>>m>>n){
if(n== && m==) break;
int i,j;
int x,y;
for(i=;i<=n;i++)
for(j=;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='@') //记录开始的位置
x=i,y=j;
}
cout<<dfs(x,y)<<endl;
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hdu 1312:Red and Black(DFS搜索,入门题)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. HDU 1312 Red and Black (DFS & BFS)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:有一间矩形房屋,地上铺了红.黑两种颜色的方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相 ...

  4. HDU 1312 Red and Black (DFS)

    Problem Description There is a rectangular room, covered with square tiles. Each tile is colored eit ...

  5. HDU 1312 Red and Black --- 入门搜索 DFS解法

    HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...

  6. HDU 1312 Red and Black --- 入门搜索 BFS解法

    HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...

  7. HDU 1312:Red and Black(DFS搜索)

      HDU 1312:Red and Black Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & ...

  8. HDU 1284 钱币兑换问题(全然背包:入门题)

    HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...

  9. 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 ...

随机推荐

  1. xml转成数组,原来这么简单!

    function xml2arr($xml){ $obj  = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $js ...

  2. ACM 马拦过河卒(动态规划)

    解题思路: 用一个二维数组a[i][j]标记 马的位置和马的跳点(统称控制点)该位置=1: 再用一个二维数组f[i][j]表示行进的位置,如果前一行的当前列不是马的控制点,或者前一列的当前行不是马的控 ...

  3. C#多线程学习 之 线程池[ThreadPool](转)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  4. 老项目的#iPhone6与iPhone6Plus适配#Icon适配

        本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020373.html ,转载请注明出处.  这是Evernote印象笔记的链接:https://www ...

  5. 用 Java 实现断点续传 (HTTP)

    断点续传的原理 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已. 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 wwww.sjtu.edu ...

  6. 破解LR时,解决loadrunner 破解错误:license security violation.Operation is not allowed

    一.由于在压力测试执行中,出现一个-10803的错误 ,为解决这个错误,重新设置的环境变量,在次执行错误,这个问题解决了,但另外一个问题出来了,LR,打开脚本编辑器老提示找不到TEMP目录,当时没有想 ...

  7. iATKOS v7硬盘安装教程(硬盘助手+变色龙安装版)

    这是作者:Tong 写的一篇安装教程 首先感谢:wowpc制作的变色龙安装版.iATKOS作者以及硬盘安装助手作者 前言:现在时代在进步,系统同样也在进步,在以前要在PC上整个Mac是很痛苦的事情,就 ...

  8. [BZOJ1659][Usaco2006 Mar]Lights Out 关灯

    [BZOJ1659][Usaco2006 Mar]Lights Out 关灯 试题描述 奶牛们喜欢在黑暗中睡觉.每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的 ...

  9. 从图片加载纹理-使用glut工具

    转载 http://blog.csdn.net/dreamcs/article/details/7696069

  10. python4delphi 安装

    环境搭建: 目前p4d已经可以支持到XE7,可惜googlecode即将关闭,不知道作者是否会在github上继续更新. 因为此开源项目历史较久远,拿到源代码后可能还需要手动修改相关的文件引用,毕竟需 ...