zoukankan      html  css  js  c++  java
  • poj 2488 A Knight's Journey

    题目

    题意:给出一个国际棋盘的大小 p*q,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。

    因为要求字典序输出最小,所以按下图是搜索的次序搜素出来的就是最小的。

    初始方向数组:int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2},  {-1, 1,-2, 2,-2,2,-1,1}};

    #include <iostream>
    #include  <cstdio>
    #include <cstring>
    
    using namespace std;
    int q,p,vis[30][30],flag;
    int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2},
            {-1, 1,-2, 2,-2,2,-1,1}};
    struct  node{
        int x,y;
    }mp[30];
    
    void dfs(int x,int y,int step,int t)
    {
        if(flag) return;
        vis[x][y]=1;
        mp[step].x=x;
        mp[step].y=y;
        if(step==p*q&&flag==0)
        {
            flag=1;
            printf("Scenario #%d:
    ",t);
            for(int i=1;i<=step;i++)
            {
               char c = mp[i].x-1+'A';
               cout<<c<<mp[i].y;
            }
            printf("
    
    ");return;
        }
        for(int i=0;i<8;i++)
        {
            int nx = x+f[0][i];
            int ny = y+f[1][i];
            if(!vis[nx][ny] && nx>=1 && nx<=q && ny>=1 && ny<=p)
                dfs(nx,ny,step+1,t);
        }
        vis[x][y]=0;
    }
    int main()
    {
        int T;cin>>T;
        for(int i=1;i<=T;i++)
        {
            cin>>p>>q;
            memset(vis,0,sizeof(vis));
            flag=0;
            dfs(1,1,1,i);
            if(!flag)
            {
                 printf("Scenario #%d:
    impossible
    
    ",i);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    数值微分(数学)(组合数)
    破冰派对(搜索)
    [NOIP2017]宝藏
    [NOIP2013]华容道
    收集邮票(数学期望)
    序列(DP)(组合数)
    luogu1357花园(矩阵运算)(状压DP)
    游戏(期望)
    [NOIP2012]疫情控制
    [NOIP2012] 开车旅行
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160139.html
Copyright © 2011-2022 走看看