hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int r,c,s,flag;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char mapp[25][25],road[1000],d[5] = {"DURL"};

bool check(int x,int y)
{
    if(x < 0 || x >= r || y < 0 || y >= c) return false;
    return true;
}

void dfs(int x,int y,int num)   //表示出发位置为(x,y),已经消灭了num个箱子
{
    if(num >= s)
    {
        road[num] = 0;
        flag = 1;
        return;
    }
    for(int k = 0; k < 4; k++)
    {
        int i = x + dir[k][0];
        int j = y + dir[k][1];
        if(!check(i,j) || mapp[i][j]) continue;  //(1)下一步就走出界外,或者与箱子之间没有空格
        while(check(i,j) && !mapp[i][j])//(2)对于不能临时改变方向的搜索这个方法比较适用
            i += dir[k][0], j += dir[k][1];
        if(!check(i + dir[k][0],j + dir[k][1])) continue;  //到达棋盘边缘,不能推
        int t = mapp[i][j];
        mapp[i+dir[k][0]][j+dir[k][1]] += t - 1;
        mapp[i][j] = 0;
        road[num] = d[k];
        dfs(i,j,num+1);
        if(flag) return;
        mapp[i+dir[k][0]][j+dir[k][1]] -= t - 1;//状态的恢复过程
        mapp[i][j] = t;
    }
}

int main()
{
    while(scanf("%d%d",&c,&r)!=EOF)
    {
        s = flag = 0;
        for(int i = 0; i < r; i++)
        {
            getchar();
            scanf("%s",mapp[i]);
            for(int j = 0; j < c; j++)
            {
                if(mapp[i][j] == ‘.‘) mapp[i][j] = 0;
                else mapp[i][j] -= ‘a‘ - 1;
                s += mapp[i][j];
            }
        }
        for(int i = 0; i < r; i++)
        {
            if(flag) break;
            for(int j = 0; j < c; j++)
            {
                if(mapp[i][j]) continue;
                dfs(i,j,0);
                if(flag == 1)
                {
                    printf("%d\n%d\n",i,j);
                    printf("%s\n",road);
                    break;
                }
            }
        }
    }
    return 0;
}
时间: 2024-08-10 19:17:57

hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了的相关文章

Java程序员学习的6个小技巧

Java程序员学习的6个小技巧 知识改变命运,对于Java程序员来说,技术不断更新,只有及时充电,才能不被市场淘汰.北京Java培训机构分享Java程序员学习的6个小技巧兄弟连IT教育作为全国最大的PHP培训机构,迄今已有10年的教育历史,7大特色课程:PHP教程.安卓培训.JAVAEE+大数据.UI设计.HTML5培训.云计算架构师,全栈工程师培训,在目前IT市场特别火,每门课程都由名师牵头,以认认真真的态度做教育,培养的学员过万,在学员心中树立了良好的口碑. 1.一定要看书 现在学习Java

学习Java语言的小技巧

最初接触到的计算机编程语言是C语言,再有了c语言的基础上,Java入门也变得简单多了.Java其实是一个地名,盛产咖啡,所以图标像咖啡一样,然而慢慢接触,你才能体会到Java的甘甜. Java的运行时在虚拟机上面的,也就是说Java相比于c语言直接接触硬件的操作安全的多,Java用虚拟内存访问数据,我编译Java用的是Eclipse这个软件,这个软件是完全免费的,初学者可以到官网去下载.当你安装好Eclipse的时候,是不能使用的,因为缺少运行环境,你还需要下载一个JDK,也就是给Java运行的

胡扯一点代码实现小技巧啦啦啦~ x

一. for(int t=m; t; t--) a[++n] = b[t]; // 循环中间的 t:非零即真,遇到 t=0 才停下 int ans(0); // 效果等价于 ans=0 二. 开数组的时候我们都喜欢从1号开始使用,而把0号元素冷落了 但是开了就是开了,0号闲着也是闲着,不如把它合理的利用起来! 所以,可以用a[0]来计数, a[0]++,a[0]--什么的, 回收利用我最强! (未完待续?)

B2B平台信息发布小技巧——ERE全体系引流

导读:通过搜索引擎搜索行业产品名或者竞争对手的公司名,查找是否有在B2B平台发布的产品信息及哪些平台.可以同样发布自己的产品到这些平台.01哪些行业适合使用B2B推广 01判断目标客户来源 正在做B2B平台推广的朋友们应该会有体会,我们在B2B平台发布产品信息的一个主要目的是要让其在搜索引擎(百度.360.搜狗)有好的排名和展现,也就是说我们的目标客户的主要来源应该是搜索引擎.所以,想判断自己的行业是否适合做B2B推广的一个重要方法就是判断你的目标客户来源. 02通过B2B平台内部产品分类查看

从命令行同时移动多个文件类型的小技巧

我们知道,将某个类型的多个文件从一个目录移动到另一个目录很简单,但同时移动多种类型的多个文件或许会很麻烦,这里介绍一些让你在 Linux 中移动多种文件类型的小技巧. 同时移动多种文件类型 方法1: 假设 dir1 的目录中有多种类型的文件,如 .pdf .doc .mp3 .mp4 .txt 等,我们先来查看 dir1 中的内容: $ ls dir1 file.txt image.jpg mydoc.doc personal.pdf song.mp3 video.mp4 这时,你希望将某些文件

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/details/52577212 [分析]一开始想简单了,对于a^x mod p这种形式的直接用欧拉定理的数论定理降幂了 结果可想而知,肯定错,因为题目并没有保证gcd(x,s+1)=1,而欧拉定理的数论定理是明确规定的 所以得另谋出路 那么网上提供了一种指数循环节降幂的方法 具体证明可以自行从网上找一找 有

[学习笔记]iphone学习小技巧

1. 版本控制 -- 是否响应某个方法 .查看当前系统版本. eg: [self respondsToSelector:@Selector(presentModalViewController:animated:)]//Yes:表示响应这个方法 [[UIDevice currentDevice].systemVersion floatValue] < 7.0 //判断当前系统是否小于7.0 2. 模态视图动画设置 eg: ModalViewController *modalVC = [[Moda

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com