Walk Out

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2912    Accepted Submission(s): 599

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
 
Recommend
wange2014   |   We have carefully selected several similar problems for you:  5342 5341 5340 5339 5338

本题思路:

1.先判断第一个点是不是0,如果是0先把所有的0都走一遍,找到哈曼顿距离最小的点(可能会有几个)。

这个过程可以用DFS也可以BFS(建议BFS,因为DFS会爆栈,必须自己把栈开导最大,后面会说明)

2.如果第一点不是0,直接从第一个点开始搜,只搜下和右两个方向,如果这两个方向有两个0,输出0,把两个0都加入队列;如果只有一个0,输出0,只把0那个点加入队列;如果是两个1,也把两个点都加入队列。

3.如果第一个点是0,再把这个0的右边的点和下边的点(超边界的不算)都加入队列开始用2的方法搜。

开始用DFS搜

 #pragma comment(linker, "/STACK:10240000000000,10240000000000")//这行代码不加就会STACK_OVERFLOW
#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1234
struct point
{
int x,y,d;
}st[N*]; int dx[]={,,-,};
int dy[]={,,,-};
int n,m,k,dis,flag;
char mat[N][N];
bool vis[N][N]; void dfs(int x,int y)
{
if(x<||x>n||y<||y>m)return;
if(mat[x][y]=='')return;
if(vis[x][y]==)return;
vis[x][y]=;
if(dis<x+y)
{
k=;
dis=x+y;
st[k].x=x;
st[k++].y=y;
}
else if(dis==x+y)
{
st[k].x=x;
st[k++].y=y;
}
for(int i=;i<;i++)
dfs(x+dx[i],y+dy[i]);
}
void bfs()
{
memset(vis,,sizeof(vis));
queue<point>q1;
queue<point>q2;
for(int i=;i<k;i++)
{
if(mat[st[i].x][st[i].y]=='')
{
if(st[i].x==n&&st[i].y==m){printf("");return;}
point a1=st[i],a2=st[i];
a1.x++;a2.y++;
if(a1.x<=n)
q1.push(a1),vis[a1.x][a1.y]=;
if(a2.y<=m)
q1.push(a2),vis[a2.x][a2.y]=;
}
else
q1.push(st[i]),vis[st[i].x][st[i].y]=;
}
printf("");
if(vis[n][m])return;
while()
{
flag=;
while(!q1.empty())
{
point cur=q1.front();
q1.pop();
for(int i=;i<;i++)
{
point next=cur;
next.x+=dx[i],next.y+=dy[i];
if(vis[next.x][next.y] || next.x< || next.x>n || next.y< || next.y>m)continue;
if(mat[next.x][next.y] == '')
flag = ;
q2.push(next);
vis[next.x][next.y]=;
}
}
printf("%d",flag);
if(vis[n][m])return; while(!q2.empty())
{
point cur=q2.front();
q2.pop();
if(flag==)
q1.push(cur);
else if(flag== && mat[cur.x][cur.y]=='')
q1.push(cur);
}
}
} int main()
{
int t;cin>>t;
while(t--)
{
memset(vis,,sizeof(vis));
dis=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",mat[i]+); if(mat[][]=='')
st[].x=,st[].y=,k=;
else
dfs(,);
bfs();
cout<<endl;
}
return ;
} //几组比较好的数据 /*
5
2 2
01
11
2 2
00
11
2 2
00
00
3 3
000
110
110
3 3
000
110
111 */

开始用BFS搜(推荐)

 #include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1234
struct point
{
int x,y;
}st[N*];
int dx[]={,,-,};
int dy[]={,,,-};
int n,m,k,dis;
char mat[N][N];
bool vis[N][N]; void bfs1()
{
memset(vis,,sizeof(vis));
queue<point>q;
point first;
first.x=first.y=;
q.push(first);vis[][]=;
st[].x=st[].y=;
k=;
while(!q.empty())
{
point cur=q.front();
q.pop();
for(int i=;i<;i++)
{
point next=cur;
next.x+=dx[i],next.y+=dy[i];
if(next.x<||next.x>n||next.y<||next.y>m)continue;
if(vis[next.x][next.y] || mat[next.x][next.y]=='')continue;
q.push(next);vis[next.x][next.y]=;
if(dis<next.x+next.y)
{
k=;
dis=next.x+next.y;
st[k].x=next.x;
st[k++].y=next.y;
}
else if(dis==next.x+next.y)
{
st[k].x=next.x;
st[k++].y=next.y;
}
}
}
}
void bfs()
{
memset(vis,,sizeof(vis));
queue<point>q1;
queue<point>q2;
for(int i=;i<k;i++)
{
if(mat[st[i].x][st[i].y]=='')
{
if(st[i].x==n&&st[i].y==m){printf("");return;}
point a1=st[i],a2=st[i];
a1.x++;a2.y++;
if(a1.x<=n)
q1.push(a1),vis[a1.x][a1.y]=;
if(a2.y<=m)
q1.push(a2),vis[a2.x][a2.y]=;
}
else
q1.push(st[i]),vis[st[i].x][st[i].y]=;
}
printf("");
if(vis[n][m])return;
while()
{
int flag=;
while(!q1.empty())
{
point cur=q1.front();
q1.pop();
for(int i=;i<;i++)
{
point next=cur;
next.x+=dx[i],next.y+=dy[i];
if(vis[next.x][next.y] || next.x< || next.x>n || next.y< || next.y>m)continue;
if(mat[next.x][next.y] == '')
flag = ;
q2.push(next);
vis[next.x][next.y]=;
}
}
printf("%d",flag);
if(vis[n][m])return; while(!q2.empty())
{
point cur=q2.front();
q2.pop();
if(flag==)
q1.push(cur);
else if(flag== && mat[cur.x][cur.y]=='')
q1.push(cur);
}
}
} int main()
{
int t;cin>>t;
while(t--)
{
dis=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",mat[i]+); if(mat[][]=='')
st[].x=,st[].y=,k=;
else
bfs1();
bfs();
cout<<endl;
}
return ;
}

其他:

1输图的时候不要%c输入,用%s输入,速度会快很多,这题如果用%c输入会TLE,(花了一下午时间找为什么TLE,最后发现居然是因为输图方式。) 所以以后都要用:

for(int i=;i<n;i++)
scanf("%s",mat[i];
or
for(int i=;i<=n;i++)
scanf("%s",mat[i]+);

2 dfs是很容易爆栈的,这题就是我开始写的用dfs的就爆栈了,这时候有一个处理办法:在代码最前面加:#pragma comment(linker, "/STACK:10240000000000,10240000000000") 这句意思是自己开一个非常大的栈,STACK:后面那数字好像已经是能开的最大的了。
此题中加入这一行本来的Runtime Error(STACK_OVERFLOW)就会变成 Accepted!

但是好像正规比赛不允许使用这种方式。

      

HDU 5335 Walk Out(多校)的更多相关文章

  1. hdu 5335 Walk Out (搜索)

    题目链接: hdu 5335 Walk Out 题目描述: 有一个n*m由0 or 1组成的矩形,探险家要从(1,1)走到(n, m),可以向上下左右四个方向走,但是探险家就是不走寻常路,他想让他所走 ...

  2. HDU 5335 Walk Out BFS 比较坑

    H - H Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  3. HDU 5335——Walk Out——————【贪心】

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  4. hdu 5335 Walk Out (2015 Multi-University Training Contest 4)

    Walk Out                                                                         Time Limit: 2000/10 ...

  5. hdu 5335 Walk Out 搜索+贪心

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  6. 2015 Multi-University Training Contest 4 hdu 5335 Walk Out

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  7. HDU 5335 Walk Out (BFS,技巧)

    题意:有一个n*m的矩阵,每个格子中有一个数字,或为0,或为1.有个人要从(1,1)到达(n,m),要求所走过的格子中的数字按先后顺序串起来后,用二进制的判断大小方法,让这个数字最小.前缀0不需要输出 ...

  8. hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4

    题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...

  9. HDU 5335 Walk Out

    题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数. 解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向 ...

随机推荐

  1. Java面试——HashCode的作用原理和实例解析

    ,也就是说,我们先通过 HashCode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 在这个桶里找到我们要的类. 请看下面这个例子 : public cla ...

  2. webservice 测试地址

    腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx Disco: http:// ...

  3. php 上传文件名出现乱码

    想必很多朋友在进行utf8编码的php开发上传功能的时候,都会遇到这样的一个问题,就是上传中文文件名的文件时,文件名会变成乱码,其实我们可以用iconv函数对文件名进行重新编码就解决问题了 可能会有不 ...

  4. 【Luogu】P3414组合数(快速幂)

    题目链接 从n的元素中选零个,选一个,选两个,选三个...选n个的方案数和,其实就是n个元素中取任意多个元素的方案数,那对于每一个元素,都有取或不取两种情况,所以方案数最终为2^n个. #includ ...

  5. [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)

    传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...

  6. Snmp的学习总结——Snmp的基本概念

    摘自:http://www.cnblogs.com/xdp-gacl/p/3978825.html 一.SNMP简单概述 1.1.什么是Snmp SNMP是英文"Simple Network ...

  7. c++ primer note

    ---恢复内容开始--- 1.decltype 2.auto 3.cbegin 4.cend 5.constexpr 6.(*Parray)[10]=&arr; //Parray 指向一个含有 ...

  8. angular父子scope之间的访问

    1.子可以访问父的scope,也可以更新相同的scope,但父scope不会被刷新 2.父要访问子scope的方法

  9. JSON与字符串互相转换的几种方法

    1 2 3 4 5 6 7 8 字符串转对象(strJSON代表json字符串)   var obj = eval(strJSON);   var obj = strJSON.parseJSON(); ...

  10. Jackson工具类(各种转换)

    首先要在项目中引入jackson的jar包(在此不做说明) 下面直接上代码 public class JacksonUtils { private final static ObjectMapper ...