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:\n",++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.\n");
78             else printf("%d segments.\n",ans);
79         }
80         printf("\n");
81     }
82     return 0;
83 }
View Code

 

posted @ 2014-11-24 16:16  pengmq  阅读(196)  评论(0编辑  收藏  举报