poj 2488 深搜+回溯
2012-05-28 11:35
471 查看
package com.liang.poj; import java.util.Scanner; public class Test2488 { static boolean b = true; public static void main(String[] args) { Scanner scan = new Scanner(System.in); int x = scan.nextInt(); int y = scan.nextInt(); int[][] chess = new int[x][y]; boolean[][] visited = new boolean[x][y]; int[][] ways = new int[x][y]; if (x == 1 && y == 1) { b = false; System.out.println(0); } for (int i = 0; i < chess.length; i++) { for (int j = 0; j < chess[i].length; j++) { dfs(0, i, j, chess, visited, ways); } } if (b) { System.out.println("不存在这样的点"); } } public static void dfs(int level, int x, int y, int[][] chess, boolean[][] visited, int[][] ways) { if (y > chess[0].length || x > chess.length) { return; } if (visited[x][y] == false) { ways[x][y] = level; visited[x][y] = true; } if (level == (chess.length*chess[0].length-1)) { b = false; show(ways); } for (int i = 0; i < chess.length; i++) { for (int j = 0; j < chess[i].length; j++) { if (j == y + 1 && i == x + 2 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y + 2 && i == x + 1 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y - 1 && i == x + 2 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y - 2 && i == x + 1 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y + 1 && i == x - 2 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y + 2 && i == x - 1 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y - 1 && i == x - 2 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } if (j == y - 2 && i == x - 1 && j <= chess[0].length && i <= chess.length) { if (visited[i][j] == false) { dfs(level + 1, i, j, chess, visited, ways); visited[i][j] = false; } } } } } public static void show(int[][] ways) { for (int i = 0; i < ways.length; i++) { for (int j = 0; j < ways[i].length; j++) { System.out.print(ways[i][j] + " "); } System.out.println(); } } }
题目大意]:
给定一个p*q国际象棋棋盘,问马(骑士Knight)能否从某个点开始以跳马规则(横一步竖两步或横两步竖一步)将整个棋盘遍历;要求每个格子只能跳过一次,能的话,打印路线;
Sample Input:(先输入行,在输入列)
1 1
2 3
4 3
Sample Output:
0
不存在这样的点
0 7 2 (4 3的两种路线)
3 10 5
6 1 8
9 4 11
0 11 2
3 8 5
6 1 10
9 4 7
相关文章推荐
- POJ训练计划2488_A Knight's Journey(DFS+回溯)
- poj2488 回溯 注意字典 边缘的处理思想
- POJ-2488(回溯+剪枝)
- poj 2488 dfs+回溯
- 经典回溯——POJ 2488
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)
- POJ 2488 DFS+回溯
- POJ 2488 A Knight's Journey(DFS+回溯)
- POJ 2488 回溯
- POJ 2488 A Knight's Journey DFS 深搜回溯
- POJ 2488 A Knight's Journey 递归回溯题解
- poj 2488 A Knight's Journey(DFS)
- POJ 2488(DFS)
- POJ2488 A Knight's Journey(DFS)
- poj-2488 A Knight's Journey
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
- poj2488.特坑的一题
- POJ2488 A Knight's Journey 解题报告