Hdu 1312 Red and Black 深搜

Red and Black 
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) 
Total Submission(s): 13508 Accepted Submission(s): 8375

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 
6 9 
….#. 
…..# 
…… 
…… 
…… 
…… 
……

@…

.#..#. 
11 9 
.#……… 
.#.#######. 
.#.#…..#. 
.#.#.###.#. 
.#.#..@#.#. 
.#.#####.#. 
.#…….#. 
.#########. 
……….. 
11 6 
..#..#..#.. 
..#..#..#.. 
..#..#..### 
..#..#..#@. 
..#..#..#.. 
..#..#..#.. 
7 7 
..#.#.. 
..#.#..

…@…

..#.#.. 
..#.#.. 
0 0

Sample Output 
45 
59 

13

深搜简单题目

题意: n*m的方阵有红格或是黑格,只能走黑格 
每次只能走上下左右四个紧邻方向的格子,求 
这个人最后能走多少个黑格子。

#include<stdio.h>
int di[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int sum;
void dfs(char map[][20],int ii,int jj,int n,int m){
    int i,j,k,dx,dy;
    if(ii<0||jj<0||ii>=m||jj>=n){
    	return;
	}
    for(k=0;k<4;k++){
    	dx=ii+di[k][0];
    	dy=jj+di[k][1];
    	if(dx<0||dy<0||dx>=m||dy>=n||map[dx][dy]=='#'){
			continue;
		}
		sum++;
		map[dx][dy]='#';
		dfs(map,dx,dy,n,m);
	}
}
int main(){
	int n,m,i,j,k;
	int begin,end;
	char map[20][20],str[21];
	while(scanf("%d%d",&n,&m),m){
		getchar();
		sum=1;
		for(i=0;i<m;i++){
			scanf("%s",str);
			getchar();
			for(j=0;j<n;j++){
				map[i][j]=str[j];
				if(map[i][j]=='@'){
					begin=i;
					end=j;
				}
			}
		}
		map[begin][end]='#';
	    dfs(map,begin,end,n,m);
		printf("%d\n",sum);
	}
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值