poj2488(A Knight's Journey)

题目地址:A Knight's Journey

题目大意:

    骑士按照日字形走,给你p*q的棋盘,问你骑士能否走遍棋盘的所有位置,输出骑士走的路线序列p(1.2....)q(A.B...)

按照字典序输出,如果不能输出 'impossible' .

解题思路:

   搜索。因为是遍历全图所有点,所以必然经过A1. 又因为按字典序,既然A1可以经过,所以必然可以从A1开始。

   注意: 1.按照字典序输出意思为(先安A.B.C...)排序输出。

            const int dirx[]={-1,1,-2,2,-2,2,-1,1};

            const int diry[]={-2,-2,-1,-1,1,1,2,2};

            2.每组数据后有换行。

代码:

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 //#include <map>
 15 #include <set>
 16 using namespace std;
 17 /***************************************/
 18 #define ll long long
 19 #define int64 __int64
 20 #define PI 3.1415927
 21 /***************************************/
 22 const int INF = 0x7f7f7f7f;
 23 const double eps = 1e-8;
 24 const double PIE=acos(-1.0);
 25 const int d1x[]= {0,-1,0,1};
 26 const int d1y[]= {-1,0,1,0};
 27 const int d2x[]= {0,-1,0,1};
 28 const int d2y[]= {1,0,-1,0};
 29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
 30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
 31 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
 32 /***************************************/
 33 void openfile()
 34 {
 35     freopen("data.in","rb",stdin);
 36     freopen("data.out","wb",stdout);
 37 }
 38 priority_queue<int> qi1;
 39 priority_queue<int, vector<int>, greater<int> >qi2;
 40 /**********************华丽丽的分割线,以上为模板部分*****************/
 41 const int dirx[]={-1,1,-2,2,-2,2,-1,1};
 42 const int diry[]={-2,-2,-1,-1,1,1,2,2};
 43 int vis[30][30];
 44 int p,q;
 45 int ce;
 46 struct Node
 47 {
 48     int x;
 49     char y;
 50 } node[30];
 51 int DFS(int x,int y,int cnt)
 52 {
 53     int xx,yy;
 54     if (cnt-1==p*q)
 55     {
 56         ce=1;
 57         return 0;
 58     }
 59     for(int i=0; i<8; i++)
 60     {
 61          xx=x+dirx[i];
 62          yy=y+diry[i];
 63         if (xx>0&&xx<=p&&yy>0&&yy<=q&&!vis[xx][yy])
 64         {
 65             // cnt++;
 66             vis[xx][yy]=1;
 67             node[cnt].x=xx;
 68             node[cnt].y=yy;
 69             DFS(xx,yy,cnt+1);
 70             vis[xx][yy]=0;
 71         }
 72         if (ce)
 73             return 0;
 74     }
 75 }
 76 int main()
 77 {
 78     int cas;
 79     int cntt=1;
 80     scanf("%d",&cas);
 81     while(cas--)
 82     {
 83         scanf("%d%d",&p,&q);
 84         memset(vis,0,sizeof(vis));
 85         memset(node,0,sizeof(node));
 86         int cnt=1;
 87         ce=0;
 88         node[cnt].x=1;
 89         node[cnt].y=1;
 90         vis[1][1]=1;
 91         DFS(1,1,cnt+1);
 92         printf("Scenario #%d:
",cntt++);
 93         if (ce)
 94         {
 95             for(int i=1; i<=p*q; i++)
 96             {
 97                 printf("%c%d",node[i].y+'A'-1,node[i].x);
 98             }
 99             printf("
");
100         }
101         else
102             printf("impossible
");
103         if (cas)
104             printf("
");
105     }
106     return 0;
107 }
View Code
屌丝终有逆袭日,*******。
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3888210.html