深搜2 poj 2448
来源:互联网 发布:cherry机械键盘 mac 编辑:程序博客网 时间:2024/05/10 00:55
poj 2448
A Knight's Journey
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 21891 Accepted: 7393
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.
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.
If no such path exist, you should output impossible on a single line.
Sample Input
31 12 34 3
Sample Output
Scenario #1:A1Scenario #2:impossibleScenario #3:A1B3C1A2B4C2A3B1C3A4B2C4Accepted692K16MSG++1245B输出一条遍历所有点的路径,要求每个点只能遍历一次,深搜找路径
按照字典序顺序输出遍历的路径,,dir为马走日的八个方向,按照字典序顺序遍历的八个方向为
int dx[8]={-2,-2,-1,-1,1,1,2,2}, //按字典序方向行走,用way记录走的路径,visit标记是否走过。。。
dy[8]={-1,1,-2,2,-2,2,-1,1};
//rear是当前走的步数,下面是我徒手画的8个方向的排序
代码:
#include <cstdio>#include<iostream>#include<cstring>#include<algorithm>#define maxn 15using namespace std;int way[maxn*maxn][2],visit[maxn][maxn];int dx[8]={-2,-2,-1,-1,1,1,2,2}, //按字典序方向行走 dy[8]={-1,1,-2,2,-2,2,-1,1}; int q,p;bool dfs(int tot,int rear,int x,int y){ int i,j,nx,ny; if(rear==tot)return 1; //搜索成功 for(i=0;i<8;i++) { nx=x+dir[i][0]; ny=y+dir[i][1]; if(nx>=0&&nx<q&&ny>=0&&ny<p&&!visit[nx][ny]) { visit[nx][ny]=1; //标记为经过 if(dfs(tot,rear+1,nx,ny)) //搜索下一个 { way[rear][0]=nx; way[rear][1]=ny; return 1;//搜索成功直接跳出,即为所走的路径 } visit[nx][ny]=0; //搜索不成功,标记为未经过 } } return 0;//搜索不成功}int main(){ int i,j,cas=1,t; scanf("%d",&t); while(t--) { scanf("%d%d",&p,&q); memset(visit,0,sizeof(visit)); way[0][0]=0;way[0][1]=0; visit[0][0]=1; //标记A1已经经过 printf("Scenario #%d:\n",cas++); if(dfs(p*q,1,0,0)) { for(i=0;i<p*q;i++) printf("%c%d",way[i][0]+'A',way[i][1]+1); } else printf("impossible"); printf("\n"); if(t!=0)printf("\n"); }}
- 深搜2 poj 2448
- 2-sat 五题 poj 3207 & poj 3683 & poj 3678 &poj 2723 & poj 2749
- kmp 练习2 poj 2185 poj 2406
- 【POJ】【POJ刷水合集】【#2】
- poj 2488 深搜+回溯
- 深搜1 poj 1562
- poj 1753 枚举+深搜
- poj 1321 深搜
- poj 2362 深搜
- poj 3620 深搜
- POJ 1979 深搜
- POJ 1111 深搜
- POJ 1111 深搜
- POJ 1564 深搜
- poj 1562 深搜
- poj 1950 Dessert 深搜
- poj 2488 深搜
- poj 3009 深搜
- windows下面 修改oracle数据库实例名(SID)
- 《海量数据库解决方案》学习笔记:表连接
- Linux下C/C++查找某一进程
- Android磁盘管理-系统源码分析(1)
- ubuntu下软件安装相关资料收集
- 深搜2 poj 2448
- 字符串与正则表达式
- 蓝牙协议的命令和事件
- 【算法】汉诺塔
- 为什么没人发现你开发的应用?
- linux可以修改oracle数据库密码
- [javascript]中文排序比较函数localeCompare()
- 经本人测试,30个值得养的的博客
- 16岁的博士----神童还是悲剧?