• HDU 5335 Walk Out(多校)


    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 nm 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 (1n,m1000). 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搜

      1 #pragma comment(linker, "/STACK:10240000000000,10240000000000")//这行代码不加就会STACK_OVERFLOW
      2 #include<queue>
      3 #include<math.h>
      4 #include<stdio.h>
      5 #include<string.h>
      6 #include<iostream>
      7 #include<algorithm>
      8 using namespace std;
      9 #define N 1234
     10 struct point
     11 {
     12     int x,y,d;
     13 }st[N*2];
     14 
     15 int dx[]={1,0,-1,0};
     16 int dy[]={0,1,0,-1};
     17 int n,m,k,dis,flag;
     18 char mat[N][N];
     19 bool vis[N][N];
     20 
     21 void dfs(int x,int y)
     22 {
     23     if(x<1||x>n||y<1||y>m)return;
     24     if(mat[x][y]=='1')return;
     25     if(vis[x][y]==1)return;
     26     vis[x][y]=1;
     27     if(dis<x+y)
     28     {
     29         k=0;
     30         dis=x+y;
     31         st[k].x=x;
     32         st[k++].y=y;
     33     }
     34     else if(dis==x+y)
     35     {
     36         st[k].x=x;
     37         st[k++].y=y;
     38     }
     39     for(int i=0;i<4;i++)
     40         dfs(x+dx[i],y+dy[i]);
     41 }
     42 void bfs()
     43 {
     44     memset(vis,0,sizeof(vis));
     45     queue<point>q1;
     46     queue<point>q2;
     47     for(int i=0;i<k;i++)
     48     {
     49         if(mat[st[i].x][st[i].y]=='0')
     50         {
     51             if(st[i].x==n&&st[i].y==m){printf("0");return;}
     52             point a1=st[i],a2=st[i];
     53             a1.x++;a2.y++;
     54             if(a1.x<=n)
     55                 q1.push(a1),vis[a1.x][a1.y]=1;
     56             if(a2.y<=m)
     57                 q1.push(a2),vis[a2.x][a2.y]=1;
     58         }
     59         else
     60             q1.push(st[i]),vis[st[i].x][st[i].y]=1;
     61     }
     62     printf("1");
     63     if(vis[n][m])return;
     64     while(1)
     65     {
     66         flag=1;
     67         while(!q1.empty())
     68         {
     69             point cur=q1.front();
     70             q1.pop();
     71             for(int i=0;i<2;i++)
     72             {
     73                 point next=cur;
     74                 next.x+=dx[i],next.y+=dy[i];
     75                 if(vis[next.x][next.y] || next.x<1 || next.x>n || next.y<1 || next.y>m)continue;
     76                 if(mat[next.x][next.y] == '0')
     77                     flag = 0;
     78                 q2.push(next);
     79                 vis[next.x][next.y]=1;
     80             }
     81         }
     82         printf("%d",flag);
     83         if(vis[n][m])return;
     84 
     85         while(!q2.empty())
     86         {
     87             point cur=q2.front();
     88             q2.pop();
     89             if(flag==1)
     90                 q1.push(cur);
     91             else if(flag==0 && mat[cur.x][cur.y]=='0')
     92                 q1.push(cur);
     93         }
     94     }
     95 }
     96 
     97 int main()
     98 {
     99     int t;cin>>t;
    100     while(t--)
    101     {
    102         memset(vis,0,sizeof(vis));
    103         dis=0;
    104         scanf("%d%d",&n,&m);
    105         for(int i=1;i<=n;i++)
    106             scanf("%s",mat[i]+1);
    107 
    108         if(mat[1][1]=='1')
    109             st[0].x=1,st[0].y=1,k=1;
    110         else
    111             dfs(1,1);
    112         bfs();
    113         cout<<endl;
    114     }
    115     return 0;
    116 }
    117 
    118 //几组比较好的数据
    119 
    120 /*
    121 5
    122 2 2
    123 01
    124 11
    125 2 2
    126 00
    127 11
    128 2 2
    129 00
    130 00
    131 3 3
    132 000
    133 110
    134 110
    135 3 3
    136 000
    137 110
    138 111
    139 
    140 
    141 */

    开始用BFS搜(推荐)

      1 #include<queue>
      2 #include<math.h>
      3 #include<stdio.h>
      4 #include<string.h>
      5 #include<iostream>
      6 #include<algorithm>
      7 using namespace std;
      8 #define N 1234
      9 struct point
     10 {
     11     int x,y;
     12 }st[N*2];
     13 int dx[]={1,0,-1,0};
     14 int dy[]={0,1,0,-1};
     15 int n,m,k,dis;
     16 char mat[N][N];
     17 bool vis[N][N];
     18 
     19 void bfs1()
     20 {
     21     memset(vis,0,sizeof(vis));
     22     queue<point>q;
     23     point first;
     24     first.x=first.y=1;
     25     q.push(first);vis[1][1]=1;
     26     st[0].x=st[0].y=1;
     27     k=1;
     28     while(!q.empty())
     29     {
     30         point cur=q.front();
     31         q.pop();
     32         for(int i=0;i<4;i++)
     33         {
     34             point next=cur;
     35             next.x+=dx[i],next.y+=dy[i];
     36             if(next.x<1||next.x>n||next.y<1||next.y>m)continue;
     37             if(vis[next.x][next.y] || mat[next.x][next.y]=='1')continue;
     38             q.push(next);vis[next.x][next.y]=1;
     39             if(dis<next.x+next.y)
     40             {
     41                 k=0;
     42                 dis=next.x+next.y;
     43                 st[k].x=next.x;
     44                 st[k++].y=next.y;
     45             }
     46             else if(dis==next.x+next.y)
     47             {
     48                 st[k].x=next.x;
     49                 st[k++].y=next.y;
     50             }
     51         }
     52     }
     53 }
     54 void bfs()
     55 {
     56     memset(vis,0,sizeof(vis));
     57     queue<point>q1;
     58     queue<point>q2;
     59     for(int i=0;i<k;i++)
     60     {
     61         if(mat[st[i].x][st[i].y]=='0')
     62         {
     63             if(st[i].x==n&&st[i].y==m){printf("0");return;}
     64             point a1=st[i],a2=st[i];
     65             a1.x++;a2.y++;
     66             if(a1.x<=n)
     67                 q1.push(a1),vis[a1.x][a1.y]=1;
     68             if(a2.y<=m)
     69                 q1.push(a2),vis[a2.x][a2.y]=1;
     70         }
     71         else
     72             q1.push(st[i]),vis[st[i].x][st[i].y]=1;
     73     }
     74     printf("1");
     75     if(vis[n][m])return;
     76     while(1)
     77     {
     78         int flag=1;
     79         while(!q1.empty())
     80         {
     81             point cur=q1.front();
     82             q1.pop();
     83             for(int i=0;i<2;i++)
     84             {
     85                 point next=cur;
     86                 next.x+=dx[i],next.y+=dy[i];
     87                 if(vis[next.x][next.y] || next.x<1 || next.x>n || next.y<1 || next.y>m)continue;
     88                 if(mat[next.x][next.y] == '0')
     89                     flag = 0;
     90                 q2.push(next);
     91                 vis[next.x][next.y]=1;
     92             }
     93         }
     94         printf("%d",flag);
     95         if(vis[n][m])return;
     96 
     97         while(!q2.empty())
     98         {
     99             point cur=q2.front();
    100             q2.pop();
    101             if(flag==1)
    102                 q1.push(cur);
    103             else if(flag==0 && mat[cur.x][cur.y]=='0')
    104                 q1.push(cur);
    105         }
    106     }
    107 }
    108 
    109 int main()
    110 {
    111     int t;cin>>t;
    112     while(t--)
    113     {
    114         dis=0;
    115         scanf("%d%d",&n,&m);
    116         for(int i=1;i<=n;i++)
    117             scanf("%s",mat[i]+1);
    118 
    119         if(mat[1][1]=='1')
    120             st[0].x=1,st[0].y=1,k=1;
    121         else
    122             bfs1();
    123         bfs();
    124         cout<<endl;
    125     }
    126     return 0;
    127 }

    其他:

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

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

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

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

          

  • 相关阅读:
    跨域的几种方式
    jQuery滚动条回到顶部或指定位置
    获取屏幕高度、宽度
    js判断手机系统和微信
    js获取url中的参数
    css3内容溢出属性
    css盒模型
    [转]swagger2 入门教程
    [转]cron表达式的用法
    [转]React入门看这篇就够了
  • 原文地址:https://www.cnblogs.com/wmxl/p/4699826.html
Copyright © 2020-2023  润新知