zoukankan      html  css  js  c++  java
  • poj1101 the game 广搜

    题目大意:

      类似于连连看,问从起点到终点最少需要几条线段。

      规则:

        1、允许出界。

        2、空格的地方才能走。

    分析:

      题目做下来发现没有卡时间,所以主要还是靠思路。也就是说不用考虑离线算法。直接以每个起点开始搜。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 const int N=80;
     9 int r,c,sx,sy,ex,ey,ans;
    10 int vis[N][N],Map[N][N];
    11 int dx[4]={1,-1,0,0};
    12 int dy[4]={0,0,1,-1};
    13 bool isin(int x,int y)
    14 {
    15     return x>=0&&x<=r+1&&y>=0&&y<=c+1;
    16 }
    17 struct node
    18 {
    19     int x,y,s;
    20 };
    21 node a,b;
    22 queue<node> q;
    23 void BFS()
    24 {
    25     int i,j,k,x,y;
    26     while(!q.empty())
    27     {
    28         a=q.front(); q.pop();
    29         for(k=0;k<4;k++)
    30         {
    31             x=a.x,y=a.y;
    32             while(1)
    33             {
    34                 x+=dx[k]; y+=dy[k];
    35                 if(!isin(x,y)) break;
    36                 if(x==ex&&y==ey){ans=a.s;return ;}
    37                 if(!vis[x][y])
    38                 {
    39                     b.x=x; b.y=y;b.s=a.s+1;
    40                     q.push(b);
    41                     vis[x][y]=1;
    42                 }
    43                 else break;
    44             }
    45         }
    46     }
    47 }
    48 int main()
    49 {
    50     //freopen("test.txt","r",stdin);
    51     int cas=0,t;
    52     while(scanf("%d%d",&c,&r)!=EOF&&c)
    53     {
    54         int i,j;
    55         char ch[100];
    56         memset(Map,0,sizeof(Map));
    57         gets(ch);
    58         for(i=1;i<=r;i++)
    59         {
    60             gets(ch);
    61             for(j=0;j<c;j++)
    62                 if(ch[j]=='X') Map[i][j+1]=1;
    63         }
    64         printf("Board #%d:
    ",++cas);
    65         t=0;
    66         while(scanf("%d%d%d%d",&sy,&sx,&ey,&ex)!=EOF&&sy)
    67         {
    68             for(i=0;i<=r+1;i++)
    69                 for(j=0;j<=c+1;j++)
    70                     vis[i][j]=Map[i][j];
    71             while(!q.empty()) q.pop();
    72             a.x=sx,a.y=sy,a.s=1;
    73             q.push(a);
    74             ans=-1;
    75             BFS();
    76             printf("Pair %d: ",++t);
    77             if(ans==-1) printf("impossible.
    ");
    78             else printf("%d segments.
    ",ans);
    79         }
    80         printf("
    ");
    81     }
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    Spring学习之声明式事物管理
    SSH整合所需jar
    Spring学习之AOP
    常见MyEclipse报错—— serialVersionUID的作用
    Spring学习之基本概念
    Java基础——I/O续
    Java基础——I/O
    Vim学习总结
    Java基础——异常处理
    Git 学习总结
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/4118945.html
Copyright © 2011-2022 走看看