B-A Knight's Journey

来源:互联网 发布:mac创建windows安装盘 编辑:程序博客网 时间:2024/06/14 21:52

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

这里写图片描述
给一个n1*n2的棋盘,从(0,0)出发,每次走日字形,能否不重复的遍历所有的点.从A1这个格子开始搜索,就能保证字典序是小的;除了这个条件,我们还要控制好马每次移动的方向,控制方向时保证字典序最小(即按照下图中格子的序号搜索)。控制好这两个条件,直接从A1开始深搜就行了。

#include<cstdio>  #include<cstring>  #include<algorithm>  using namespace std;  int path[88][88], vis[88][88], p, q, cnt;  bool flag;  int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};  int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};  bool judge(int x, int y)  {      if(x >= 1 && x <= p && y >= 1 && y <= q && !vis[x][y] && !flag)          return true;      return false;  }  void DFS(int r, int c, int step)  {      path[step][0] = r;      path[step][1] = c;      if(step == p * q)      {          flag = true;          return ;      }      for(int i = 0; i < 8; i++)      {          int nx = r + dx[i];          int ny = c + dy[i];          if(judge(nx,ny))          {              vis[nx][ny] = 1;              DFS(nx,ny,step+1);              vis[nx][ny] = 0;          }      }  }  int main()  {      int i, j, n, cas = 0;      scanf("%d",&n);      while(n--)      {          flag = 0;          scanf("%d%d",&p,&q);          memset(vis,0,sizeof(vis));          vis[1][1] = 1;          DFS(1,1,1);          printf("Scenario #%d:\n",++cas);          if(flag)          {              for(i = 1; i <= p * q; i++)                  printf("%c%d",path[i][1] - 1 + 'A',path[i][0]);          }          else              printf("impossible");          printf("\n");          //if(n != 0)              printf("\n");      }      return 0;  }  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 黄金戴久了变黑怎么办 玫瑰金褪色不亮了怎么办 黄金带久了不亮怎么办 玉石带久了不亮怎么办 手表带久了不亮怎么办 蜜蜡带久了不亮怎么办 钛钢首饰不亮了怎么办 潘多拉玫瑰金戒指褪色了怎么办 金色手表漆掉了怎么办 玫瑰金表带褪色后怎么办 K金褪色或泛黄怎么办 钛钢玫瑰金变黑怎么办 玫瑰金手镯掉色了怎么办 彩金颜色不亮了怎么办 玫瑰金链子黑了怎么办 18k玫瑰金变黑了怎么办 玫瑰金戒指遇到火变黑怎么办 18k白金发黄了怎么办 18k金掉色后怎么办吗 dw手表金色掉漆怎么办 dw玫瑰金手表褪色怎么办 dw金色表带黑了怎么办 机械表机芯坏了怎么办 银镀玫瑰金褪色怎么办 苹果七p玫瑰金掉漆怎么办 美度镀金表掉色怎么办 吃了发黑的香菇怎么办 脸上的皮肤暗黄怎么办 吃了变黑的香菇怎么办 怀孕喝了玫瑰茶怎么办 孕妇爱喝茉莉茶怎么办 干菊花生虫了该怎么办 黑枸杞放了两年怎么办 来大姨妈喝茶了怎么办 干柠檬片过期了怎么办 山地玫瑰根黑了怎么办 带18k的金过敏怎么办 18k钻戒断了怎么办 18k钻戒戒托变色怎么办 苹果七中间按键脱漆怎么办 苹果手机屏幕边缘掉漆了怎么办