程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> POJ 2488 A Knight's Journey

POJ 2488 A Knight's Journey

編輯:關於C
A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23108 Accepted: 7819 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 Source   TUD Programming Contest 2005, Darmstadt, Germany 讀懂了題目這題就會做了,以前的馬在跳的時候都是在線上,這個題是這方格內還真有些不適應,轉化成在線上就好 [cpp]   #include <stdio.h>   #include <string.h>   int status[100][100],s;   int vex[]={-2,-2,2,2,-1,-1,1,1};   int vey[]={-1,1,-1,1,-2,2,-2,2};   char path1[1000],prepath1[1000];   int path2[1000],prepath2[1000],top,n,m,key,k;   int main()   {       void dfs(int x,int y);       int i,j,t,tem;       scanf("%d",&t);       tem=1;       while(t--)       {           scanf("%d %d",&n,&m);           memset(status,0,sizeof(status));           if(n==1&&m==1)           {               printf("Scenario #%d:\n",tem); tem++;               printf("A1\n");               printf("\n");               continue;           }           for(i=1;i<=n;i++)           {               for(j=1;j<=m;j++)               {                   top=0;s=1;                   memset(status,0,sizeof(status));                   prepath1[top]='A'+j-1;                   prepath2[top++]=i;                   status[i][j]=1;                   key=0; k=0;                   dfs(i,j);                   if(k==1)                   {                       break;                   }               }               if(j!=m+1)               {                   break;               }           }           printf("Scenario #%d:\n",tem); tem++;           if(i!=n+1)           {               for(i=0;i<=n*m-1;i++)               {                   printf("%c%d",path1[i],path2[i]);               }               printf("\n");           }else           {               printf("impossible\n");           }           printf("\n");       }       return 0;   }   void dfs(int x,int y)   {       int i,j,xend,yend,change;       for(i=0;i<=7;i++)       {           xend=x+vex[i]; yend=y+vey[i];           if(xend>=1&&xend<=n&¥d>=1&¥d<=m&&!status[xend][yend])           {               s++;               prepath1[top]=yend+'A'-1;               prepath2[top++]=xend;               status[xend][yend]=1;               if(s==n*m)               {                   k=1;                   if(key==0)                   {                       for(j=0;j<=n*m-1;j++)                       {                           path1[j]=prepath1[j];                           path2[j]=prepath2[j];                       }                       key=1;                   }else                   {                       change=-1;                       for(j=0;j<=n*m-1;j++)                       {                           if(path1[j]>prepath1[j])                           {                               change=1;                               break;                           }else if(path1[j]<prepath1[j])                           {                               change=0;                               break;                           }else                           {                               if(path2[j]>prepath2[j])                               {                                   change=1;                                   break;                               }else if(path2[j]<prepath2[j])                               {                                   change=0;                                   break;                               }                           }                       }                       if(change==1)                       {                           for(j=0;j<=n*m-1;j++)                           {                               path1[j]=prepath1[j];                               path2[j]=prepath2[j];                           }                       }                   }               }else               {                   dfs(xend,yend);               }               s--; top--;               status[xend][yend]=0;           }       }   }    
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved