红黑瓷砖--dfs求解
2017-10-16 14:03
99 查看
有一个矩形房间,覆盖正方形瓷砖。每块瓷砖涂成了红色或者黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一。但是他不能移到红砖上,只能移动到黑砖上。编写一个程序,计算通过重复上述移动所能经过的黑砖数。
每个数据集有H行,其中每行包括W个字符。每个字符的含义如下:‘.’ – 黑砖‘#’ – 红砖‘@’ – 男子当前所在的位置。两个0表示输入结束。
用dfs遍历计算能走过的瓷砖数目,注意标记问题。。。。注释部分是第二种方式,但是好像这种方式快一点点。。。
输入
输入包含多个数据集,一个数据集开头行包含两个正整数W和H,W和H分别表示矩形房间的列数和行数,且都不超过20。每个数据集有H行,其中每行包括W个字符。每个字符的含义如下:‘.’ – 黑砖‘#’ – 红砖‘@’ – 男子当前所在的位置。两个0表示输入结束。
输出
对每个数据集,程序应该输出一行,包含男子从初始瓷砖出发可到达的瓷砖数import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static int m, n, k, sum = 0, cnt; static String[] a = new String[505]; static char[][] matrix = new char[505][505]; static int[][] dir = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; static void dfs(int x,int y) { // if (x >= n || y >= m|| x < 0 || y < 0) // return ; //如果遇到红瓷砖或者已经走过 if(matrix[x][y]=='#'||matrix[x][y]=='*') return; matrix[x][y]='*';//标记走过的 sum++;//计数 //四个方向尝试一遍 for (int i = 0; i < 4; i++) { int tx, ty; tx = x + dir[i][0]; ty = y + dir[i][1]; //下标越界处理 if (tx >= n || ty >= m|| tx < 0 || ty < 0) continue; dfs(tx,ty); } // dfs(x,y+1); // dfs(x+1,y); // dfs(x,y-1); // dfs(x-1,y); } public static void main(String[] args) { while(in.hasNext()){ int x=0,y=0; m = in.nextInt(); n = in.nextInt(); if(m==0&&n==0) break; for (int i = 0; i < n; i++) a[i] = in.next(); for (int i = 0; i < n; i++) { for (int j = 0; j < a[i].length(); j++) { matrix[i][j] = a[i].charAt(j); if(matrix[i][j]=='@'){ x=i; y=j; } } } sum=0; dfs(x,y); System.out.println(sum); } } }
用dfs遍历计算能走过的瓷砖数目,注意标记问题。。。。注释部分是第二种方式,但是好像这种方式快一点点。。。
相关文章推荐
- 杭电OJ(HDOJ)1010题:Tempter of the Bone(DFS,迷宫求解)
- 迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解
- zoj 1008 暴力枚举求解dfs+优化
- DFS--求解迷宫问题
- dfs实现单源点最短路径求解
- HDU 2553 <dfs求解N皇后问题>
- 选课 树形DP+多叉树转二叉树+dfs求解答案
- zoj 1008 暴力枚举求解dfs+优化
- 独立岛问题的BFS,DFS求解
- LeetCode 113. Path Sum II DFS求解
- DFS求解DecodeWays输出所有情况和方法数
- 蓝桥杯 瓷砖铺放(dfs)
- 关于迷宫问题的dfs与bfs两中求解方式
- DFS求解素数环问题
- 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- 22. Generate Parentheses——本质:树,DFS求解可能的path
- leetcode 399. Evaluate Division 等式求解+典型的DFS深度优先遍历
- 题目1025:最大报销额 (dfs深度优先搜索)以及 01背包求解
- poj 2676(dfs求解数独问题,对行列和格子分别加bool数组优化搜索)