HDU 5335 Walk Out
题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数。
解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向右走就可以获得位数最少的二进制数,然后贪心的想,如果后或下有0就一定走0,没0就把1都看一遍,以之前搜到的0做起点,一层一层遍历可行路径,直到终点。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long using namespace std; int n, m;
bool vis[1005][1005];
char maze[1005][1005];
struct node
{
int x, y;
node(int x, int y) : x(x), y(y) {}
node() {}
};
queue <node> q;
vector <node> v[2];
int maxn = 0;
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
void bfs()
{
q.push(node(0, 0));
vis[0][0] = 1;
if(maze[0][0] == '1')
{
q.pop();
return ;
}
while(!q.empty())
{
node tmp = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int tx = tmp.x + dir[i][0], ty = tmp.y + dir[i][1];
if(tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && maze[tx][ty] == '0')
{
vis[tx][ty] = 1;
maxn = max(maxn, tx + ty);
q.push(node(tx, ty));
}
}
}
}
int main()
{
int T;
while(~scanf("%d", &T))
{
while(T--)
{
maxn = 0;
memset(vis, 0, sizeof vis);
for(int i = 0; i < 2; i++)
v[i].clear();
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%s", maze[i]);
bfs();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(vis[i][j] && (i + j == maxn))
v[0].push_back(node(i, j));
}
}
int cnt = 0;
int flag2 = 1;
string ans;
if(maze[0][0] == '1')
ans += '1';
else
ans += '0';
while(1)
{
int len = v[cnt].size();
for(int i = 0; i < len; i++)
{
if((v[cnt][i].x == n - 1) && (v[cnt][i].y == m - 1))
{
flag2 = 0;
break;
}
for(int j = 0; j < 2; j++)
{
int tx = v[cnt][i].x + dir[j][0], ty = v[cnt][i].y + dir[j][1];
if(tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && maze[tx][ty] == '0')
{
vis[tx][ty] = 1;
v[!cnt].push_back(node(tx, ty));
}
}
}
if(!flag2) break;
if(v[!cnt].size() == 0)
{
ans += '1';
for(int i = 0; i < len; i++)
{
for(int j = 0; j < 2; j++)
{
int tx = v[cnt][i].x + dir[j][0], ty = v[cnt][i].y + dir[j][1];
if(tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && maze[tx][ty] == '1')
{
vis[tx][ty] = 1;
v[!cnt].push_back(node(tx, ty));
}
}
}
}
else
ans += '0';
v[cnt].clear();
cnt = !cnt;
}
int len = ans.size();
int flag1 = 1;
for(int i = 0; i < len; i++)
{
if((ans[i] == '0') && flag1) continue;
flag1 = 0;
printf("%c", ans[i]);
}
if(flag1)
printf("0");
puts("");
}
}
return 0;
}
不知道为什么一直MLE……换了个写法重写了一下才过……
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(多校)
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 ...
随机推荐
- 【BZOJ 1067】 [SCOI2007]降雨量
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...
- swift基础--字符串
(1)遍历 (2)长度 (3)拼接 (4)插值 (5)大小写 (6)trim (7)split ……等等 var a = "你好" var b = String() a.isEmp ...
- 微软Hololens设备 浅分析
微软Hololens的定位是一款MR 设备(Mixed reality).MR与AR的不同我认为是MR能够将真实环境的场景信息与虚拟对象进行完美的融合,它是基于SLAM(SimultaneousLoc ...
- linux驱动系列之makefile
在linux环境下做嵌入式无论是编写应用程序还是驱动程序等等,都需要用make来进行程序的编译,就需要学会自己编写Makefile.Makefile主要的作用有3点:1.决定编译哪些文件 2.怎样编译 ...
- eclipse 书签
虽然eclipse有back to和forward两个功能帮助我们阅读代码,但有时候代码一层一层看下去后,会忘了自己最初的起点. 因此想到了eclipse的书签bookmark功能. 首先,添加书签. ...
- 深入浅出百度地图API开发系列(3):模块化设计
在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...
- kill 进程卡住,超时kill方法
还是有漏洞 ,万一 working.py未超时, kill_job.sh 会不会杀死别人的进程啊start.sh#!/bin/bash python working.py &python wo ...
- [Unity+Android]横版扫描二维码
原地址:http://blog.csdn.net/dingxiaowei2013/article/details/25086835 终于解决了一个忧伤好久的问题,严重拖了项目进度,深感惭愧!一直被一系 ...
- C++中的构造函数,拷贝构造函数和赋值运算
关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...
- 如何在eclipse里使用git
新版都自带git插件了.在项目上右键,选team,选share project,再选择git就可以了. 如果在本地使用git比较简单.如果要多人共享的使用git,那么需要专门的服务器,并提供ssh,这 ...