POJ A Knight's Journey

题意:给你一定的格子的棋盘,一匹马是否可以遍历完全整个棋盘

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 const int MAXN=30;

 4 

 5 //国际象棋纵是数字,横是英文

 6 struct Node//用于最后字典序输出

 7 {

 8     int x,y;

 9 }node[MAXN];

10 

11 int t1[]={-1,1,-2,2,-2,2,-1,1};

12 int t2[]={-2,-2,-1,-1,1,1,2,2};

13 int vis[MAXN][MAXN];

14 

15 int q,p;

16 int flag;

17 

18 void DFS(int row,int col,int step)

19 {

20     if(flag) return ;

21     if(step==p*q) 

22     {

23         flag=1;

24         return ;//遍历结束

25     }

26     if(row<0 || row >=p || col<0 || col>=q) return;

27     if(vis[row][col]) return ;

28 

29     node[step].x=row;

30     node[step].y=col;

31     vis[row][col]=1;

32     for (int i=0;i<8;i++)//八个方向

33     {

34       if(!vis[row+t1[i]][col+t2[i]])

35           DFS(row+t1[i],col+t2[i],step+1);

36     } 

37     vis[row][col]=0;

38     

39 }

40 

41 int main()

42 {

43     int T;

44     int cas=1;

45     scanf("%d",&T);

46     while(T--)

47     {

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

49         flag=0;

50         scanf("%d%d",&p,&q);

51         DFS(0,0,0);

52         printf("Scenario #%d:\n",cas++);

53         if(!flag) printf("impossible\n");

54         else

55         {

56             for (int i=0;i<p*q;i++)

57             {

58                 printf("%c%d",node[i].y+'A',node[i].x+1);

59             }

60             printf("\n");

61         }

62         printf("\n");

63     }

64     return 0;

65 }

今天又把这道题重新做了一遍,搜索现在依旧很弱,这么简单的一个搜索都要调试半天找错误,后来才发现原来是忘记提前跳出了,当flag=1的时候说明已经找到额

第二个问题就是字典序搜索啦,由于国际象棋是列为字母,横为数字,所以他的字典树是

int row[]= {-1,1,-2,2,-2,2,-1,1};

int col[]= {-2,-2,-1,-1,1,1,2,2};

  

View Code
#include<stdio.h>

#include<string.h>

const int MAXN=40;

int vis[MAXN][MAXN];

int row[]= {-1,1,-2,2,-2,2,-1,1};

int col[]= {-2,-2,-1,-1,1,1,2,2};

struct Node

{

    int x,y;

} node[MAXN];

int flag;

int p,q;



void DFS(int i,int j,int cur)

{

    if(flag) return ;

    if(cur==p*q)//这里也是问题,老是无法确定边界

    {

        flag=1;

        node[cur].x=i;

        node[cur].y=j;

        return ;

    }

    node[cur].x=i;

    node[cur].y=j;

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

    {

        int row_vis=row[k]+i;

        int col_vis=col[k]+j;

        if(row_vis>=1 && row_vis<=p && col_vis>=1 && col_vis<=q && vis[row_vis][col_vis]==0)

        {

            vis[row_vis][col_vis]=1;

            DFS(row_vis,col_vis,cur+1);

            vis[row_vis][col_vis]=0;

        }

    }

}



int main()

{

    int i,j;

    int T;

    int cas=1;

    scanf("%d",&T);

    while(T--)

    {

        flag=0;

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

        scanf("%d%d",&p,&q);

        for(i=1; i<=p; i++)

        {

            for(j=1; j<=q; j++)

            {

                if(flag) break;

                vis[i][j]=1;

                DFS(i,j,1);

                vis[i][j]=0;

            }

            if(flag) break;

        }

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

        if(!flag) printf("impossible");

        else

        {

            for(i=1; i<=q*p; i++)

            {

                printf("%c%d",node[i].y+'A'-1,node[i].x);

            }

        }

        printf("\n\n");

    }

    return 0;

}

 

你可能感兴趣的:(poj)