HDU 5335——Walk Out——————【贪心】
Walk Out
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1292 Accepted Submission(s): 239
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.
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
const int INF=0x3f3f3f3f;
int vis[maxn][maxn];
int Map[maxn][maxn];
int way[2*maxn];
int f[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,k;
struct NODE{
int x,y;
};
queue<NODE>Q;
stack<NODE>S;
int BFS(){
NODE st,tmp;
while(!Q.empty()){
st=Q.front();
Q.pop();
int xx,yy;
for(int i=0;i<4;i++){
xx=st.x+f[i][0];
yy=st.y+f[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&(!vis[xx][yy])&&Map[xx][yy]==0){
if(xx==n&&yy==m)
return -1;
tmp.x=xx,tmp.y=yy;
vis[xx][yy]=1;
Q.push(tmp);
}
}
}
}
bool check(int x,int y){
int xx,yy;
for(int i=0;i<4;i++){
xx=x+f[i][0];
yy=y+f[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&vis[xx][yy]==1){
return true;
}
}
return false;
}
void Find1(int typ){
while(!S.empty())
S.pop();
while(!Q.empty())
Q.pop();
int maxs=-INF;
NODE st,tmp; if(typ==0){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(Map[i][j]==1){
if(check(i,j)){ if(i+j>maxs){
maxs=i+j;
}
st.x=i,st.y=j;
vis[i][j]=2;
S.push(st);
}
}
}
}
}else{
st.x=1,st.y=1;
vis[1][1]=2;
maxs=2;
S.push(st);
}
if(S.empty()==0)
way[k++]=1;
while(!S.empty()){
st=S.top();
S.pop();
if(st.x+st.y==maxs){
Q.push(st);
}
}
while(1){
int flag=0;
while(!Q.empty()){
st=Q.front();
Q.pop();
if(st.x==n&&st.y==m){
return ;
}
int xx,yy;
for(int i=0;i<2;i++){
xx=st.x+f[i][0];
yy=st.y+f[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&(!vis[xx][yy])){
if(Map[xx][yy]==0){
flag=1;
}
tmp.x=xx,tmp.y=yy;
vis[xx][yy]=2;
S.push(tmp);
}
}
}
if(flag==1){
way[k++]=0;
while(!S.empty()){
st=S.top();
S.pop();
if(Map[st.x][st.y]==0){
Q.push(st);
}
}
}else{
way[k++]=1;
while(!S.empty()){
st=S.top();
S.pop();
Q.push(st);
}
}
}
}
int main(){
int t;
char str[1020];
scanf("%d",&t);
while(t--){
k=0;
memset(vis,0,sizeof(vis));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",str+1);
for(int j=1;j<=m;j++){
Map[i][j]=str[j]-'0';
}
}
if(n==m&&n==1&&Map[1][1]==0){
printf("0\n");continue;
}
if(Map[1][1]==0){
NODE st;
st.x=1,st.y=1;
vis[1][1]=1;
while(!Q.empty())
Q.pop();
Q.push(st);
if(BFS()==-1) {
printf("0\n");
continue;
}
Find1(0);
}
else{
Find1(1);
}
for(int i=0;i<k;i++){
printf("%d",way[i]);
}printf("\n");
}
return 0;
}
/*
50
3 3
001
111
101 55
1 2
01 */
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 S ...
- hdu 5335 Walk Out (2015 Multi-University Training Contest 4)
Walk Out Time Limit: 2000/10 ...
- HDU 5335 Walk Out
题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数. 解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向 ...
- HDU 5335 Walk Out(多校)
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 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 ...
随机推荐
- spark 熟悉过程
spark shell 交互 启动:bin 目录下 ./spark-shell --master local [ ×× ] --jars ×××.jar 进入[ >> sc ...
- Use Vim as a Python IDE
Use Vim as a Python IDE I love vim and often use it to write Python code. Here are some useful plugi ...
- js对象的深浅拷贝
JS数据类型可以分为(ES5,暂时不考虑ES6): 简单数据类型:Number.String.undefined.boolean 复杂数据类型:Object.Array 简单的数据类型,往往是赋值操作 ...
- java webservices 以Axis1.4方式 调用sap webservice接口.
1. 首先需要下载Axis1.4 jar包,这个必应搜索大把,下载下来后把jar包加入eclipse工程项目路径中即可. 2. 下载mail.jar和activation.jar 俩个包.下载地址:h ...
- 10.15 lzxkj
几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...
- php 过滤重复的数组
首先数组分为一维数组和多维数组 1.一维数组 $a = array(a,b,c,d,a,b,e,f,g); array_unique($a) 就行了 2.二维数组 $a = array( array( ...
- NSArray,NSMutable和NSSet,NSMutableSet和NSDictionary,NSMutableDictionary用法
开始编写应用程序的代码时,可以利用大量的 Objective-C 框架.其中,为所有应用程序提供基本服务的 Foundation 框架尤为重要.Foundation 框架包括表示基本数据类型的值类(如 ...
- CF431C k-Tree dp
Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was inspired ...
- kuangbin专题十六 KMP&&扩展KMP HDU1711 Number Sequence
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M ...
- springboot整合fastdfs
首先pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...