HDU 5335 Walk Out(多校)
Walk Out
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.
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.
2 2
11
11
3 3
001
111
101
101
本题思路:
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(多校)的更多相关文章
- hdu 5335 Walk Out (搜索)
题目链接: hdu 5335 Walk Out 题目描述: 有一个n*m由0 or 1组成的矩形,探险家要从(1,1)走到(n, m),可以向上下左右四个方向走,但是探险家就是不走寻常路,他想让他所走 ...
- HDU 5335 Walk Out BFS 比较坑
H - H Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- HDU 5335——Walk Out——————【贪心】
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- hdu 5335 Walk Out (2015 Multi-University Training Contest 4)
Walk Out Time Limit: 2000/10 ...
- hdu 5335 Walk Out 搜索+贪心
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S ...
- 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 ...
- HDU 5335 Walk Out (BFS,技巧)
题意:有一个n*m的矩阵,每个格子中有一个数字,或为0,或为1.有个人要从(1,1)到达(n,m),要求所走过的格子中的数字按先后顺序串起来后,用二进制的判断大小方法,让这个数字最小.前缀0不需要输出 ...
- hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4
题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...
- HDU 5335 Walk Out
题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数. 解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向 ...
随机推荐
- SVN如何避免冲突
在团队开发时,必然会用到代码版本控制工具,比如SVN. 但是多人共同维护同一份代码,当对同一文件进行增删时,就可能造成冲突,如何尽可能避免冲突相当重要. 首先,每次,新建任何文档,都会修改项目文件,所 ...
- cf950f Curfew
神贪心--写了一个晚上加一个早上. 先考虑只有一个宿管的情况. 首先,如果这个宿舍人多了,多余的人就跑到下一个宿舍.(如果这是最后一个宿舍的话,多的就躺床底下) 如果这个宿舍人少了,但是能从别的宿舍调 ...
- 小白用shiro(2)
本文来自网易云社区 作者:王飞 以上的配置走完以后就可以用,下面讲讲个人需求,以及踩过的坑: 1.如何修改cookie的名称,默认名称"rememberMe"太丑了有木有? 首先丢 ...
- LiveScript 字面量
The LiveScript Book 字面值 Numbers .4是被视为无效的,你必须使用前导0.例如:0.4. 1.20162.12.343.0.4 数字之间的下划线和数值后追加的字母将 ...
- NOJ——1628Alex’s Game(III)(DFS+回溯)
[1628] Alex’s Game(III) 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Alex likes to play with one and zero as you ...
- [luoguP4035] [JSOI2008]球形空间产生器(高斯消元)
传送门 设球心的坐标为未知量 用最后一个点来表示球面到球心的距离,那么它和前n个式子相等 移项乱搞 最后高斯消元 #include <cmath> #include <cstdio& ...
- [HDU-4825] Xor-Sum (01字典树)
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...
- 【字符串】BNUOJ 52781 Book Borders
https://www.bnuoj.com/v3/problem_show.php?pid=52781 [AC] #include<bits/stdc++.h> using namespa ...
- es6 箭头函数 map、find
var value = arr.map(function (x) {return x * x}); const arr = [1,2,3,4]; const value = arr.map(x =& ...
- Mountaineers
Mountaineers 时间限制: 3 Sec 内存限制: 128 MB 题目描述 The Chilean Andes have become increasingly popular as a ...