1. 程式人生 > >[POJ] 2488.A Knight's Journey

[POJ] 2488.A Knight's Journey

題目傳送門 題意:日字走,一次走完給定的p*q棋盤,記錄步驟,輸出 思路:dfs + 回溯

#include <algorithm>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int p, q;
int dy[8] = {-2, -2
, -1, -1, 1, 1, 2, 2}; int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; int chess[26][26]; bool flag; struct step { int x; char y; } path[26]; void dfs(int x, int y, int counts) { path[counts].x = x; path[counts].y = y + 'A' - 1; int x1, y1; if (counts == p * q) { flag = true; for (int
i = 1; i <= p * q; i++) printf("%c%d", path[i].y, path[i].x); printf("\n"); } if (flag) return; for (int i = 0; i < 8; i++) { x1 = x + dx[i]; y1 = y + dy[i]; if (x1 > 0 && x1 <= p && y1 > 0 && y1 <= q && !chess[x1][y1]) { chess[x1][y1] = 1
; dfs(x1, y1, counts + 1); chess[x1][y1] = 0; } } } int main() { int n; scanf("%d", &n); int c = 1; while (n--) { memset(chess, 0, sizeof(chess)); flag = false; scanf("%d%d", &p, &q); printf("Scenario #%d:\n", c++); chess[1][1] = 1; dfs(1, 1, 1); if (!flag) printf("impossible\n"); printf("\n"); } system("pause"); return 0; }