首页 > 代码库 > 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 }
poj1101 the game 广搜
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。