G - 深搜 基础

Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

Background
The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. 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

解析见代码
代码:

/*
hdu2488 深搜,判断能否走完全图,并要求输出路径
首先是能否走完全图的判断,深搜函数加一个参数step,
来判断是否走完全图,同时用flag进行标记,方便输出两种情况
再就是路径如何保存,只需要保存每一步的x,y坐标即可,使用
一个二位组就可以保存。同时因为vis数组是以步数为标准来进行保存的
其值会随着递归回溯不断更新,始终保证是最新解,step=p*q标志着递归
成功,按照步数输出即可,注注意格式要求的是先输纵坐标后输横坐标
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
const int maxn=100;
int vis[maxn*maxn][2];//vis二维数组,前一个参数代表是第几步,后一个参数0代表横坐标,后一个参数代表纵坐标。
int p,q,step,flag;
char maps[maxn][maxn];
int f[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//输出要求按字典序输出,同时注意大写字母是列编号,所以方向数组应该是按照先y后x字典序开
int ans=0;
int dis[maxn][maxn];
void dfs(int x,int y,int step)
{
    if(step==p*q&&flag==0)
    {
       cout<<"Scenario #"<<++ans<<":"<<endl;
        for(int i=0;i<p*q;i++)
        printf("%c%d",'A'+vis[i][1],vis[i][0]+1);
        flag=1;
        cout<<endl<<endl;//输出格式要求
        return;
    }
    for(int i=0;i<8;i++)
    {
        int a=x+f[i][0];
        int b=y+f[i][1];
        if(a>=0&&a<p&&b>=0&&b<q&&!dis[a][b])
        {
            dis[a][b]=1;
            vis[step][0]=a;
            vis[step][1]=b;
            dfs(a,b,step+1);
             dis[a][b]=0;//回溯时该点状态恢复
            if(flag) return;//相当于一个剪枝操作,找到就返回,大大提高了程序工作效率
        }
    }
}
int main()
{
    int n;
    cin>>n;
  while(n--)
  {
        memset(dis,0,sizeof(dis));
        cin>>p>>q;
        flag=0;
        dis[0][0]=1;//标记数组,避免重复搜索
        vis[0][0]=0,vis[0][1]=0;
         dfs(0,0,1);
        if(!flag)//用flag来判断最终是否走完全图
        {
            cout<<"Scenario #"<<++ans<<":"<<endl;
    cout<<"impossible"<<endl<<endl;

}
  }
    return 0;
}

hdu2488 dfs的更多相关文章

  1. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  2. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  3. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  4. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)

    来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS   Memory Limit: 65536 ...

  7. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

随机推荐

  1. spark1.3.1使用基础教程

    spark可以通过交互式命令行及编程两种方式来进行调用: 前者支持scala与python 后者支持scala.python与java 本文参考https://spark.apache.org/doc ...

  2. html Table实现表头固定

    最近一直在搞前台琐碎的东西,也学习了一下linux,没有时间对新的东西进行深入的研究和学习,没有写博客,不过归咎其原因还是在于自己的惰怠. 废话不多说,今天想将一个前台页面设计的一个小东西分享一下,那 ...

  3. TransactionScope的正确用法(转自:http://blog.csdn.net/greystar/article/details/1359960)

    前一阵贴了一个关于transactionscope的贴子,以为是MS的BUG.后来经过认真仔细的调试,才找到原因. 原来的代码本身是没有没问题的.只是关于事务资源的处理放错了地方.正确的写法应该如下 ...

  4. 网站UV,与IP、PV

    什么是网站UV,与IP.PV在概念上的区别? UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00:00-24:00内相同的客户端只被计算一次. PV(访问量) ...

  5. C程序设计语言练习题1-7

    练习1-7 编写一个打印EOF的值的程序. #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数,它不接受参数值. { // ...

  6. IIC 概述之源码仿真

    7.1.1 I2C总线简介 1.I2C总线的基本结构 I2C总线由数据线SDA和时钟线SCL构成,每条线都通过上拉电阻接向正电源,所有采用I2C接口标准的器件均并行挂接在总线上,如图7-1所示. I2 ...

  7. javascript 数组slice和splice

    var a = [1,4,2,5,6,9,10];console.log(a.slice(3)); //[5,6,9,10]console.log(a.slice(-3)); //[6,9,10]co ...

  8. ubuntu 下GIT的安装

    linux下软件的安装方式有多种,最简单的莫过于从软件中心直接安装了或者用命令行直接安装 sudo apt-get install git 但是这样的安装却使我们体会不到最新版本的功能,如果我们想要体 ...

  9. Android开发的体会

    View Functionality--------------->逻辑 Data----------------------->实体,包括从View.Net.其他对象比如Location ...

  10. Unity中的关节

    关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节.链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物体就会产 ...