zoukankan      html  css  js  c++  java
  • HDU 2821 Pusher

      原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821

      首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关了。

      其实这道题算是比较水点搜索题,直接DFS + 回溯,但是题目描述不是很清楚使得很难下手,后来枚举题意才知道在边缘位置不会出现嵌套盒子,而且所有输入都肯定有解决的方案,所有的输入数据都是标准的。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <string>
     4 #include <stdlib.h>
     5 #include <math.h>
     6 #include <vector>
     7 #include <map>
     8 #include <queue>
     9 #include <algorithm>
    10 #include <iostream>
    11 #include <stack>
    12 using namespace std;
    13 const int maxn = 30;
    14 
    15 int dr[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    16 char dd[4] = {'R', 'L', 'D', 'U'};
    17 char g[maxn][maxn];
    18 char path[25 * 25 * 10];
    19 int a[maxn][maxn];
    20 int r, c;
    21 bool ok(int x, int y)
    22 {
    23     if(x >= 0 && x < c && y >= 0 && y < r && a[y][x] == 0)
    24         return true;
    25     return false;
    26 }
    27  
    28 int dfs(int cy, int cx, int cnt, int len)
    29 {
    30     if(len == cnt)
    31         return 1;
    32     for(int k = 0; k < 4; k++)
    33     {
    34         int x = cx + dr[k][0];
    35         int y = cy + dr[k][1];
    36         if(ok(x, y))
    37         {
    38             do
    39             {
    40                 x += dr[k][0];
    41                 y += dr[k][1];
    42             }
    43             while(ok(x, y));
    44             if(x >= 0 && x < c && y >= 0 && y < r)
    45             {
    46                 int tmp = a[y][x];
    47                 a[y + dr[k][1]][x + dr[k][0]] += a[y][x] - 1;
    48                 a[y][x] = 0;
    49                 path[len] = dd[k];
    50                 if(dfs(y, x, cnt, len+1))
    51                     return 1;
    52                 path[len] = '';
    53                 a[y][x] = tmp;
    54                 a[y + dr[k][1]][x + dr[k][0]] -= a[y][x] - 1;
    55             }
    56         }
    57  
    58     }
    59     return 0;
    60 }
    61  
    62 int main()
    63 {
    64     int cnt;
    65     while(scanf("%d %d", &c, &r) != EOF)
    66     {
    67         cnt = 0;
    68         for(int i = 0; i < r; i++)
    69         {
    70             scanf("%s", g[i]);
    71             for (int j = 0; j < c; j++)
    72             {
    73                 if(g[i][j] != '.')
    74                     cnt += g[i][j] - 'a' + 1, a[i][j] = g[i][j] - 'a' + 1;
    75                 else
    76                     a[i][j] = 0;
    77             }
    78         }
    79         int i, j;
    80         bool flag = false;
    81         for(i = 0; i < r; i++)
    82         {
    83             for(j = 0; j < c; j++)
    84             {
    85                 if(a[i][j] == 0 && dfs(i, j, cnt, 0))
    86                 {
    87                     flag = true;
    88                     break;
    89                 }
    90             }
    91             if(flag) break;
    92         }
    93         printf("%d
    %d
    ", i, j);
    94         for(int i = 0; i < cnt; i++) putchar(path[i]);
    95         putchar('
    ');
    96     }
    97     return 0;
    98 }
    99  
    View Code

      

  • 相关阅读:
    【转】 VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区
    Scintilla开源库使用指南(二)
    Scintilla开源库使用指南(一)
    【转】MFC 多文档
    多视图识别
    获得MFC窗口其它类指针的方法
    sql2005 查看数据库或表大小的系统存储过程 sp_spaceused
    哪里是乐土?关于团队良性循环 (转)
    项目管理反思——前言
    项目经理思考——团队
  • 原文地址:https://www.cnblogs.com/huangfeihome/p/3179486.html
Copyright © 2011-2022 走看看