前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ A Knight's Journey

POJ A Knight's Journey

作者头像
用户1624346
发布2018-04-11 17:11:37
4790
发布2018-04-11 17:11:37
举报
文章被收录于专栏:calmoundcalmound

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

 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};
#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档