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

    Description
    Background
    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

    题意: 在n*m的格子里按照给定的八种方式跳跃能不能走完所有格子 如果能 按照字典序输出(这是个大坑)

              还要注意每组要有一个空行

    思路:直接按照顺序进行深度搜索 反正最多也只有到26

            注意:1.标记数组要记得回溯

                    2.每个样例输出换行

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int mat[10][10],vis[10][10];
    struct root
    {
      int x;
      int y;
    };
    root ans[100];
    int n,m;
    int ok;
    int op[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
    bool flag(int x,int y)
    {
      if(x>=0&&x<n&&y>=0&&y<m) return true;
      return false;
    }
    void dfs(int i,int j,int rt)
    {
      if(ok) return ;
      ans[rt].x=i;
      ans[rt].y=j;
      if(rt==n*m-1)
      {
        ok=1; return ;
      }
      for(int k=0;k<8;k++)
      {
        int x=i+op[k][0];
        int y=j+op[k][1];
        if(flag(x,y)&&vis[x][y]==0)
        {
          vis[x][y]=1;
          dfs(x,y,rt+1);
          vis[x][y]=0;
        }
      }
    }
    
    int main()
    {
      int t;
      int i,j;
      int cas=1;
      scanf("%d",&t);
      while(t--)
      {
        ok=0;
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
        {
          if(ok) break;
          for(j=0;j<m;j++)
          {
            if(ok) break;
            vis[i][j]=1;
            dfs(i,j,0);
            vis[i][j]=0;
          }
        }
        printf("Scenario #%d:
    ",cas++);
        if(!ok) printf("impossible
    
    ");
        else
        {
          for(i=0;i<n*m;i++)
          {
            printf("%c%d",ans[i].y+'A',ans[i].x+1);
          }
          printf("
    
    ");
        }
      }
      return 0;
    }
    

      

  • 相关阅读:
    C++中的 . 和 >
    JVM内存学习
    JAVA内部类
    2013年3月25日
    Dalvik虚拟机
    多线程访问数据库
    深入学习Android笔记(一)
    结对项目四则运算 “软件”之升级版
    分布式版本控制系统Git的安装与使用
    第一次作业准备
  • 原文地址:https://www.cnblogs.com/sola1994/p/3911575.html
Copyright © 2011-2022 走看看