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. 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)

    I think: 给出k(4≤k≤5000)个互不相同的整数组成的序列Ni,判断是否存在4个整数Np.Nq.Nr和Ns(1≤p<q<r<s≤k),使得Nq>Ns>Np&g ...

  2. 远程桌面连接不上|windows server 2003 sp2 termdd.sys(转载)

    远程桌面连接不上|windows server 2003 sp2 termdd.sys.请教一个问题,为什么 Windows Server 2003 打上SP2补丁,就不能通过远程桌面连接上去了?服务 ...

  3. user32.dll

    user32.dll中的所有函数 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  4. 转:Java NIO系列教程(七) Socket Channel

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...

  5. JavaScript 中 for in 循环和数组的问题

    本文由 伯乐在线 - ElvisKang 翻译,进林 校稿.未经许可,禁止转载!英文出处:adripofjavascript.com.欢迎加入翻译小组. JavaScript的for…in循环用于迭代 ...

  6. editplus如何插入当前时间_Ctrl+D

    之前的工作日志一般都是用excel来写的,但那个占用内存有点大,有时也比较麻烦,有时内容一行没办法显示,会自动截断,有点类似缩略图,无法一目了然 习惯了使用editplus,轻便快速,不占内存.但是有 ...

  7. [BZOJ1177][Apio2009]Oil

    [BZOJ1177][Apio2009]Oil 试题描述 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M ...

  8. Delphi开发Windows服务程序

    开发步骤: 1.New->Other->Service Application 2.现在一个服务程序的框架已经搭起来了 打开Service1窗口,有几个属性说明一下: AllowPause ...

  9. linux 回收站的添加

    在~下     .bashrc或者.bash_profile加入 mkdir -p ~/.trash     alias rm=trash       trash()     {      mv $@ ...

  10. NGINX userid 分析、解码

    NGINX userid 分析.解码 生成userid的代码在 http/modules/ngx_http_userid_filter_module.c 大概550行左右. uid_set 是4个ui ...