poj 2488 dfs+回溯
2015-11-04 15:26
411 查看
A Knight’s Journey
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 36725 Accepted: 12472
Description
Background
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
Input
The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, … , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, …
Output
The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number.
If no such path exist, you should output impossible on a single line.
Sample Input
3
1 1
2 3
4 3
Sample Output
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
直接搜回溯就好,水题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 36725 Accepted: 12472
Description
Background
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
Input
The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, … , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, …
Output
The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number.
If no such path exist, you should output impossible on a single line.
Sample Input
3
1 1
2 3
4 3
Sample Output
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
直接搜回溯就好,水题
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <stack> //#define LOCAL using namespace std; typedef struct{ char sc; int si; }Point; typedef struct{ int xx; int yy; }POint; int G[100][100]; int m,n; stack<Point>sta; POint move[] = {-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2}; bool IsTrue(int x,int y){ if(x>=1&&x<=m&&y>=1&&y<=n&&!G[x][y]) return true; return false; } bool IsT(void){ int i,j; for(i = 1;i<=m;i++) for(j = 1;j<=n;j++) if(!G[i][j]) return false; return true; } bool dfs(int x,int y){ int i; Point term; term.sc = 'A' + y - 1; term.si = x; G[x][y] = 1; if(IsT()){ sta.push(term); return true; } for(i = 0;i<8;i++){ int tx = x + move[i].xx,ty = y + move[i].yy; if(IsTrue(tx,ty)) if(dfs(tx,ty)){ sta.push(term); return true; } } G[x][y] = 0; return false; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out1.txt","w",stdout); #endif // LOCAL int N; int CNT = 1; scanf("%d",&N); while(N--){ scanf("%d%d",&m,&n); memset(G,0,sizeof(G)); while(!sta.empty()) sta.pop(); bool ok = dfs(1,1); printf("Scenario #%d:\n",CNT++); if(ok){ while(!sta.empty()){ Point term = sta.top(); sta.pop(); printf("%c%d",term.sc,term.si); } printf("\n\n"); }else printf("impossible\n\n"); } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链