zoukankan      html  css  js  c++  java
  • 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!

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

          

  • 相关阅读:
    c 的内存分配与释放原则: 通常应遵循“谁malloc,谁free”的原则。
    总算知道怎样从ImageMagick生成的数据转换成HICON: MagickGetImageBlob & LookupIconIdFromDirectoryEx
    收藏:Non-direct与direct ByteBuffer区别
    java NIO 直接与非直接缓冲区
    [收藏]:[算法]LRU和LFU的区别
    异步IO的并发能力:backlog的配置很重要
    ByteBuffer: 当由一个byte[]来生成一个固定不变的ByteBuffer时,使用ByteBuffer.wrap(byte[]);
    ByteBuffer的allocate与allocateDirect2013-01-11
    Windows完成端口与Linux epoll技术简介
    Java并发——Fork/Join框架与ForkJoinPool
  • 原文地址:https://www.cnblogs.com/wmxl/p/4699826.html
Copyright © 2011-2022 走看看