1. 程式人生 > >poj 2488 深搜+回溯

poj 2488 深搜+回溯

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