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). In every position of this maze, there is either a 0

or a 1

written on it.

An explorer gets lost in this grid. His position now is
(1,1)

, and he wants to go to the exit. Since to arrive at the exit is easy for him,
he wants to do something more difficult. At first, he‘ll write down the number
on position (1,1)

. Every time, he could make a move to one adjacent position (two positions are
adjacent if and only if they share an edge). While walking, he will write down
the number on the position he‘s on to the end of his number. When finished, he
will get a binary number. Please determine the minimum value of this number in
binary system.

Input

The first line of the input is a single integer T (T=10)

, indicating the number of testcases.

For each testcase, the first line
contains two integers n

and m (1≤n,m≤1000)

. The i

-th line of the next n

lines contains one 01 string of length m

, which represents i

-th row of the maze.

Output

For each testcase, print the answer in binary system.
Please eliminate all the preceding 0

unless the answer itself is 0

(in this case, print 0

instead).

Sample Input

2
2 2
11
11
3 3
001
111
101

Sample Output

111
101

Author

XJZX

Source

2015
Multi-University Training Contest 4

Recommend

wange2014   |   We have carefully selected several
similar problems for you:  5338 5337 5336 5334 5333

题目意思:

给定一个n*m的图,图上的每个点上的值为0或1,让你找到一条路,所经过的01序列最小。

从当前点来看,如果能走0肯定要走0,如果没有0才会走1,我们可以先找到能到的最远的0,然后从最远的0处,向下和向右两个方向搜索了,

(斜行递推,从第一个行开始标记下一行要走的点,然后在下一行的时候检查那些点被标记了,说明这些点可以走,然后再标记下一行的,

直到倒数第二行,由于下一行的点要么是0,要么是1,所以可以直接输出,即使下一行有多个点可以走,但是它都是0或者1)

这样处理可以排除特殊情况

,(直接从两个方向搜,可能会漏掉往左走最终到达的这个路径上全是0的这种情况)。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
#include <queue>
#define SIZE 1005
#define maxn 2010
using namespace std;
int n,m;
char Map[SIZE][SIZE];
int  visit[SIZE][SIZE];
int  d[SIZE][SIZE];
int  VIS[maxn][maxn];
int tot;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
struct node
{
    int x,y,cnt;
};
queue <node>  que;
void init()
{
    tot=1;
   memset(visit,0,sizeof(visit));
   memset(d,0,sizeof(d));
   memset(VIS,0,sizeof(VIS));
}
void dfs(int x,int y)
{
    if(visit[x][y]==1)
        return ;
    visit[x][y]=1;
    if(Map[x][y]==‘1‘)
        return ;
    d[x][y]=1;
    if(x+y>tot)
        tot=x+y;
    if(x>1)
        dfs(x-1,y);
    if(x<n)
        dfs(x+1,y);
    if(y>1)
        dfs(x,y-1);
    if(y<m)
        dfs(x,y+1);
}
void bfs()
{
    if(Map[1][1]==‘0‘)
    {
        node a,b,c;
        a.x=1; a.y=1; a.cnt=2;
        que.push(a);
        VIS[1][1]=1;
        d[1][1]=1;
        while(!que.empty())
        {
             b=que.front();
             que.pop();
             if(b.cnt > tot)
                tot=b.cnt;
             for(int i=0;i<4;i++)
             {
                 int next_x=b.x+dir[i][0];
                 int next_y=b.y+dir[i][1];
                 if( (1<=next_x) &&(next_x<=n) && (1<=next_y) && (next_y<=m) && VIS[next_x][next_y]==0 && Map[next_x][next_y]==‘0‘)
                 {
                     c.x=next_x; c.y=next_y;
                     c.cnt=next_x+next_y;
                     que.push(c);
                     VIS[next_x][next_y]=1;
                     d[next_x][next_y]=1;
                 }
             }

        }
    }
    else
        return ;

}
void solve()
{
    if(tot==m+n)
    {
        printf("0\n");
        return ;
    }
    if(tot==1)
    {
       tot=2; //代表起始点为(1,1)
       d[1][1]=1;
       printf("1");
    }
    for(int p=tot;p<n+m;p++)
    {
       int flag=1;
       for(int q=max(p-m,1);q<=min(p-1,n);q++)  //q代表行号
       {
           if(d[q][p-q])
           {
               int x=(Map[q][p-q+1]-‘0‘)?1:0;
               int y=(Map[q+1][p-q]-‘0‘)?1:0;
               flag=min(flag,x);
               flag=min(flag,y);
           }
       }
       for(int q=max(p-m,1);q<=min(p-1,n);q++)
       {
           if(d[q][p-q])
           {
               int x=(Map[q][p-q+1]-‘0‘)?1:0;
               int y=(Map[q+1][p-q]-‘0‘)?1:0;
               if(x==flag)
                  d[q][p-q+1]=1;
               if(y==flag)
                  d[q+1][p-q]=1;
           }
       }
       printf("%d",flag);
    }
     printf("\n");
}
int main()
{
    //freopen("test.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t --)
    {
        init();
        scanf("%d%d%*c",&n,&m);
       // printf("%d %d %d\n",n,m,tot);
        for(int i = 1 ; i <= n ; i ++)
        {
            scanf("%s",&Map[i][1]);
        }
       // getchar();
        //dfs(1,1);
        bfs();
      //  printf("tot: %d\n",tot);
        solve();
    }
    return 0;
}
时间: 2024-10-10 06:36:37

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

题意: 给出01矩阵,问从(1,1)到(n,m)走过的路中所有01组成的二进制字符串所代表的数字最小是多少. 分析: 首先前缀0是要去掉的,另外发现只有不断地向下和向右走就能达到最短路.所以首先dfs找到所有能走的0的位置,去掉前缀0.然后bfs向右下角进行,有0 的地方就走0,不走1,没有任何0的情况下才走1.如果有多个0就都走,看谁后面还有0.如果没有0,就全部的1都走,看谁的后面可能还有0.就是酱紫了. 另外,这个题用到了对角线的性质,x+y==tot 的时候,所有符合这个条件的点到终点的

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表中的每个地址指向的