[搜索]hdu5335

题意:

给出01矩阵,问从(1,1)到(n,m)走过的路中所有01组成的二进制字符串所代表的数字最小是多少。

分析:

首先前缀0是要去掉的,另外发现只有不断地向下和向右走就能达到最短路。所以首先dfs找到所有能走的0的位置,去掉前缀0.然后bfs向右下角进行,有0 的地方就走0,不走1,没有任何0的情况下才走1.如果有多个0就都走,看谁后面还有0.如果没有0,就全部的1都走,看谁的后面可能还有0.就是酱紫了。

另外,这个题用到了对角线的性质,x+y==tot 的时候,所有符合这个条件的点到终点的距离都相等。其实这也是反斜线,相当于按照反斜线一层一层的搜。

另外,判断tot==0 和 tot==n+m的时候顺序不同,一个AC一个WA. 自习想了一下是一种特殊情况,

1

1 1

1

的时候 这个时候两者都适合,所以应该先判断tot==n+m.


#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long

const int maxn = 1003;
using namespace std;
int n,m;
char mp[maxn][maxn];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int vis[maxn][maxn];
int tot;

void dfs(int x,int y)
{
    if(vis[x][y])return ;
    if(mp[x][y]==‘1‘)return ;
    vis[x][y]=1;     //vis 表示访问过的所有的0的位置
    if(x+y>tot)tot=x+y; //tot 表示当前走过的路的 坐标和  

    if(x+1<=n)dfs(x+1,y);
    if(y+1<=m)dfs(x,y+1);
    if(x-1>=1)dfs(x-1,y);
    if(y-1>=1)dfs(x,y-1);

}

void bfs()
{
    int i,j;
    for(i=tot;i<n+m;i++)
    {
        int flag=1;//判断是否有0可以走  如果有多个0 可以走呢?
        for(j=max(1,i-m);j<=min(n,i-1);j++)
          if(vis[j][i-j])
          {
              int y=i-j+1<=m?mp[j][i-j+1]-‘0‘:1;
              int x=j+1<=n?mp[j+1][i-j]-‘0‘:1;
              if(x==0 || y==0)flag=0;

            //  cout<<endl<<"x="<<x<<"  y="<<y<<endl;
          }
        for(j=max(1,i-m);j<=min(n,i-1);j++)
          if(vis[j][i-j])
          {
              int x=i-j+1<=m?mp[j][i-j+1]-‘0‘:1;
              int y=j+1<=n?mp[j+1][i-j]-‘0‘:1;

              if(x==flag)vis[j][i-j+1]=1;
              if(y==flag)vis[j+1][i-j]=1; //如果有多个0 ,就双管齐下
          }

          printf("%d",flag);
    }
}
int main()
{// read;
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        int i,j;
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)scanf("%s",mp[i]+1);

        tot=0;
        dfs(1,1);
        if(tot==n+m)
        {
            printf("0\n");
            continue;
        }
        if(tot==0)
        {
            printf("1");
            vis[1][1]=1;
            tot=2;
        }

        bfs();
        printf("\n");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 22:22:05

[搜索]hdu5335的相关文章

hdu5335 多校联合第四场1009 搜索

http://acm.hdu.edu.cn/showproblem.php?pid=5335 Problem Description In an n?m maze, the right-bottom corner is the exit (position (n,m) is the exit). In every position of this maze, there is either a 0 or a 1 written on it. An explorer gets lost in th

hdu5335(搜索)

Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1977    Accepted Submission(s): 373 Problem Description In an n∗m maze, the right-bottom corner is the exit (position (n,m) is the exit).

Android零基础入门第62节:搜索框组件SearchView

原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索时,也可通过监听器执行实际的搜索. SearchView默认是展示一个search的icon,点击icon展开搜索框,也可以自己设定图标.用SearchView时可指定如下表所示的常见XML属性及相关方法. 如果为SearchView增加一个配套的ListView,则可以为Se

Android----- 改变图标原有颜色 和 搜索框

本博客主要讲以下两点知识点 图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了. 搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居中,键盘搜索. 来看看效果图: 图标改变颜色:第一个界面的左边(二维码)和右边(更多)两个实现,我放进去的图片是黑色的,显示出来是白色的. 搜索框:第一个界面的图片和文字居中,还可以设置间距,第二个见面搜索设置键盘搜索按钮,点击搜

移动端 input 获取焦点后弹出带enter(类似于搜索,确定,前往)键盘,以及隐藏系统键盘

一:调出系统带回车键的键盘 在项目中经常有输入框,当输入完成后点击确定执行相应的动作.但是有些设计没有确定或者搜索按钮,这就需要调用系统键盘,点击系统键盘的确定后执行相应动作. 但是单纯的input是无法实现的,要想调出带回车的键盘必须把input放在form表单里面才可以,并且得加上action(一定要加),下面是个简单的例子. <form action class="search" onsubmit="return false;"> <i cl

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题意: 给你一个字符串s,你可以在s中的任意位置添加任意字符,问你将s变成一个回文串最少需要添加字符的个数. 题解1(LCS): 很神奇的做法. 先求s和s的反串的LCS,也就是原串中已经满足回文性质的字符个数. 然后要变成回文串的话,只需要为剩下的每个落单的字符,相应地插入一个和它相同的字符即可. 所以答案是:s.size()-LCS(s,rev(s)) 另外,求LCS时只会用到lcs[i-

Linux下的搜索命令grep(转)

一.简介 grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 通常grep会结合管道|来使用,比如把上一个命令得到的结果通过管道|传递到grep进行筛选 二.选项 -a 不要忽略二进制数据. -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容. -b 在显示符合范本样式的那一行之外,并

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

hash算法搜索获得api函数地址的实现

我们一般要获得一个函数的地址,通常采用的是明文,例如定义一个api函数字符串"MessageBoxA",然后在GetProcAddress函数中一个字节一个字节进行比较.这样弊端很多,例如如果我们定义一个杀毒软件比较敏感的api函数字符串,那么可能就会增加杀毒软件对我们的程序的判定值,而且定义这些字符串还有一个弊端是占用的字节数较大.我们想想如何我们的api函数字符串通过算法将它定义成一个4字节的值,然后在GetProcAddress中把AddressOfNames表中的每个地址指向的