蓝桥杯 第七届决赛 路径之谜
2017-05-12 14:33
211 查看
路径之谜
小明冒充X星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。【如图1.png】所示。
按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必做完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图1.png中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
输入:
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出:
一行若干个整数,表示骑士路径。
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
比如,图1.png中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
示例:
用户输入:
4
2 4 3 4
4 3 3 3
程序应该输出:
0 4 5 1 2 3 7 11 10 9 13 14 15
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
因为没有oj去判定,,我也不知道答案对不对,,感觉思路应该没错。。仅供参考。。。有错欢迎纠正。。
小明冒充X星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。【如图1.png】所示。
按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必做完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图1.png中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
输入:
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出:
一行若干个整数,表示骑士路径。
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
比如,图1.png中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
示例:
用户输入:
4
2 4 3 4
4 3 3 3
程序应该输出:
0 4 5 1 2 3 7 11 10 9 13 14 15
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
用深度搜索 dfs,不满足条件的return;
应该不是很难,不过粗心花了点,,写的有点久。因为没有oj去判定,,我也不知道答案对不对,,感觉思路应该没错。。仅供参考。。。有错欢迎纠正。。
package 第七届试题; import java.util.Iterator; import java.util.Scanner; import java.util.Stack; public class 路径之谜 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[][] map = new int ; boolean[][] m = new boolean ; int[] north = new int ; int[] west = new int ; for (int i = 0; i < n; i++) north[i] = scanner.nextInt(); for (int i = 0; i < n; i++) west[i] = scanner.nextInt(); scanner.close(); Stack<Integer> stack = new Stack<>(); m[0][0] = true; stack.push(0); north[0]--; west[0]--; dfs(map, north, west, 0, m, stack); } public static void dfs(int[][] map, int[] north, int[] west, int po, boolean[][] m, Stack<Integer> stack) { Iterator<Integer> it = stack.iterator(); // while (it.hasNext()) { // Integer integer = (Integer) it.next(); // System.out.print(integer + " "); // } // System.out.println(); // System.out.println("po=" + po + " x=" + po / 4 + " y=" + po % 4); if (po == map.length * map.length - 1) { boolean flag = true; for (int i = 0; i < map.length; i++) if (north[i] != 0 || west[i] != 0) { flag = false; break; } if (flag) { Iterator<Integer> iterator = stack.iterator(); while (iterator.hasNext()) { Integer integer = (Integer) iterator.next(); System.out.print(integer + " "); } System.out.println(); } return; } int x = po / map.length; int y = po % map.length; if (x > 0 && m[x - 1][y] == false && west[x - 1] > 0 && north[y] > 0) {// 能向上走 west[x - 1]--; north[y]--; m[x - 1][y] = true; // System.out.println("向上走 add" + (po - map.length)); stack.push(po - map.length); dfs(map, north, west, po - map.length, m, stack); west[x - 1]++; north[y]++; m[x - 1][y] = false; stack.pop(); } if (x < map.length - 1 && m[x + 1][y] == false && west[x + 1] > 0 && north[y] > 0) {// 能向下走 west[x + 1]--; north[y]--; m[x + 1][y] = true; // System.out.println("向下走 add" + (po + map.length)); stack.add(po + map.length); dfs(map, north, west, po + map.length, m, stack); west[x + 1]++; north[y]++; m[x + 1][y] = false; stack.pop(); } if (y > 0 && m[x][y - 1] == false && west[x] > 0 && north[y - 1] > 0) {// 能向左走 west[x]--; north[y - 1]--; m[x][y - 1] = true; // System.out.println("向左走 add" + (po - 1)); stack.add(po - 1); dfs(map, north, west, po - 1, m, stack); west[x]++; north[y - 1]++; m[x][y - 1] = false; stack.pop(); } if (y < map.length - 1 && m[x][y + 1] == false && west[x] > 0 && north[y + 1] > 0) { west[x]--; north[y + 1]--; m[x][y + 1] = true; // System.out.println("向右走 add" + (po + 1)); stack.add(po + 1); dfs(map, north, west, po + 1, m, stack); west[x]++; north[y + 1]++; m[x][y + 1] = false; stack.pop(); } } }
相关文章推荐
- 蓝桥杯第七届决赛JAVA真题----路径之谜
- 第七届蓝桥杯决赛JavaB组第四题 路径之谜
- 蓝桥杯-第七届蓝桥杯java B组决赛 路径之谜
- 蓝桥杯java第七届决赛第四题--路径之谜
- 蓝桥杯 第七届决赛第五题 路径之谜
- 第七届蓝桥杯大赛个人赛(软件类)决赛 第四题 路径之谜(dfs搜索+剪枝+输出路径)
- 蓝桥杯--第七届决赛:路径之谜
- 蓝桥杯第七届决赛JAVA真题----广场舞
- 第七届蓝桥杯决赛JavaA组第五题_广场舞
- 第七届蓝桥杯决赛JavaB组第二题_反幻方
- 第七届蓝桥杯决赛真题 - 机器人塔
- 第七届蓝桥杯决赛 生成树计数 最后一题
- 2015第七届蓝桥杯决赛C语言C组--五星填数(DFS)
- 第七届蓝桥杯决赛JavaA组第六题_生成树计数
- 【第七届蓝桥杯大赛个人赛(软件类)决赛B组 凑平方数 】+ DFS + set
- 第七届(16年)蓝桥杯java B组决赛 反幻方
- 蓝桥杯--第七届决赛:旗子换位
- 第七届蓝桥杯决赛 棋子换位
- 2016年第七届蓝桥杯决赛心得
- 蓝桥杯--第七届决赛:机器人塔