POJ2488(A Knight's Journey)

题目链接

典型的DFS题,骑士周游问题。

这题的关键在于字典序输出路径,要处理好搜索的顺序,另外需要注意的是,字母表示行,数字表示列。

View Code
 1 #include <stdio.h>

 2 #include <memory.h>

 3 #define N 26

 4 int dx[8]={-2,-2,-1,-1,1,1,2,2};

 5 int dy[8]={-1,1,-2,2,-2,2,-1,1};

 6 char vis[N][N],ok;

 7 int n,m;

 8 int ans[N];

 9 void dfs(int i,int j,int cnt)

10 {

11   int ni,nj,k;

12   ans[cnt]=i*m+j;

13   if(cnt+1==n*m&&!ok)

14   {

15     for(k=0;k<=cnt;k++) printf("%c%d",'A'+ans[k]/m,ans[k]%m+1);

16     ok=1;

17     printf("\n\n");

18     return;

19   }

20   for(k=0;k<8;k++)

21   {

22     ni=i+dx[k],nj=j+dy[k];

23     if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj]) continue;

24     vis[ni][nj]=1;

25     dfs(ni,nj,cnt+1);

26     vis[ni][nj]=0;

27   }

28 }

29 int main()

30 {

31   int t,kase=0,i,j;

32   scanf("%d",&t);

33   while(t--)

34   {

35     scanf("%d%d",&m,&n);

36     printf("Scenario #%d:\n",++kase);

37     if(n*m==1){puts("A1\n");continue;}

38     ok=0;

39     memset(vis,0,sizeof(vis));

40     vis[0][0]=1;

41     dfs(0,0,0);

42     if(!ok) puts("impossible\n");

43   }

44   return 0;

45 }

 

你可能感兴趣的:(poj)