poj 2488 深搜+回溯
阿新 • • 發佈:2019-01-11
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