YTU OJ 3146: 搜索基础之红与黑

198 篇文章 53 订阅

Description

有一间长方形的房子,地上铺了白色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

Input

包括多个数据集合。每个数据集合的第一行是两个整数WH,分别表示x方向和y方向瓷砖的数量。WH都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1
‘.’:黑色的瓷砖;
2
‘#’:白色的瓷砖;
3
‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。

Output

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)

Sample Input

6 9 
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0

Sample Output

45

HINT

Source

POJ


【AC代码】:

import java.util.Scanner;

public class Main {
	static int w;
	static int h;
	static int sum = 0;//总共可以走的步数
	static char b[][] = new char[21][21];//储存字符
	static boolean a[][] = new boolean[21][21];//判断当前位置是否搜索过

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			w = sc.nextInt();
			h = sc.nextInt();
			sum = 1;//@存在的地方为第一步
			if (w == 0 && h == 0)//输入0 0退出程序
				return;
			int x = 0, y = 0;
			for (int i = 1; i <= h; i++) {
				String s = sc.next();
				for (int j = 1; j <= w; j++) {
					b[i][j] = s.charAt(j - 1);
					if (b[i][j] == '@') {
						x = i;
						y = j;
					}
				}
			}
			dfs(x, y);//从@所在的地方开始进行搜索
			System.out.println(sum);
		}
	}

	private static void dfs(int x, int y) {
		// TODO Auto-generated method stub
		if (x > h || x < 1 || y < 1 || y > w || b[x][y] == '#')
			return;//不满足条件时退出
		else {
			if (a[x][y])//搜索过当前位置时退出
				return;
			if (b[x][y] == '.') {
				a[x][y] = true;//搜索过当前位置标记为真
				sum++;//步数加1
			}
			/**搜索当前点的上下左右位置*/
			dfs(x, y + 1);
			dfs(x, y - 1);
			dfs(x + 1, y);
			dfs(x - 1, y);
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值