首页 > 代码库 > poj1101 the game 广搜

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 node18 {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

 

poj1101 the game 广搜