zoukankan      html  css  js  c++  java
  • [原]poj-2488-water-DFS

    题目大意: 输入一个p*q的棋盘, 行用数字表示, 列用大写字母表示 , 1 <= p*q <= 26, 输出能够把棋盘全部空格走完且每个空格只走一次的字典序最小的路径。不存在则输出“impossible”

    坑の所在: 行列的表示, 每组解后有一空行。

    思路: 八方向dfs,方向数组要按字典序排列, 记录步数, 最先找到的一组解便是字典序最小解,便可停止搜索。


    AC代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int p, q;
    bool vis[30][30];
    int d[8][2] = { -1,-2, 1,-2, -2,-1, 2,-1, -2,1, 2,1, -1,2, 1, 2 };
    struct node{
       int x, y;
    }next[30][30];
    bool check(int a, int b)
    {
       if(a >= 0 && a < p && b >= 0 && b < q) return true;
       return false;
    }
    bool stop;
    void init()
    {
       for(int i = 0; i < 30; i++)
          for(int k = 0; k < 30; k++){
             vis[i][k] = false;
             next[i][k].x = next[i][k].y = -1;
          }
       vis[0][0] = true;
       stop = 0;
    }
    void dfs(int a, int b, int step)
    {
       if(step == p*q) {
          stop = true;
          return;
       }
       for(int i = 0; i < 8; i++){
          int dx = a + d[i][0];
          int dy = b + d[i][1];
          if(check(dx, dy) && !vis[dx][dy]){
             next[a][b].x = dx;
             next[a][b].y = dy;
             vis[dx][dy] = true;
             //cout<<a<<" "<<b<<" "<<next[a][b].x<<" "<<next[a][b].y<<endl;
             dfs(dx, dy, step+1);
             if(stop) return;
             vis[dx][dy] = false;
          }
       }
    }
    void output()
    {
       int a = 0, b = 0, t, step = 1;
       printf("%c%d", a+'A', b+1);
       while(step < p*q){
          printf("%c%d", next[a][b].y+'A', next[a][b].x+1);
          t = a;
          a = next[a][b].x;
          b = next[t][b].y;
          step++;
       }
       printf("
    ");
    }
    
    int main()
    {
       int T;
       cin>>T;
       for(int k = 1; k <= T; k++){
          scanf("%d%d", &p, &q);
          init();
          dfs(0, 0, 1);
          printf("Scenario #%d:
    ", k);
          if(stop) output();
          else printf("impossible
    ");
          if(k != T)printf("
    ");
       }
       return 0;
    }
    



    作者:u011652573 发表于2014-6-1 15:36:08 原文链接
    阅读:33 评论:0 查看评论
  • 相关阅读:
    127. Word Ladder(单词变换 广度优先)
    150. Evaluate Reverse Polish Notation(逆波兰表达式)
    32. Longest Valid Parentheses(最长括号匹配,hard)
    20. Valid Parentheses(括号匹配,用桟)
    递归桟相关
    python编写计算器
    python打印9宫格,25宫格等奇数格,且横竖斜相加和相等
    基于百度人工智能图片识别接口开发的自动录题系统
    自动收集有效IP代理
    python数据储存
  • 原文地址:https://www.cnblogs.com/ZiningTang/p/3834741.html
Copyright © 2011-2022 走看看