A Famous Grid(HDU4255)BFS

本文提供了一种使用广度优先搜索(BFS)解决HDU 4255问题的方法,该问题涉及在一个400x400的矩阵中寻找两个素数之间的最短路径。通过构建特定的矩阵并采用BFS算法,文章详细解释了如何有效地求解此类问题。

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4255

题目的数据是10000以内的,但是要建400*400的矩阵用一次bfs就可以完成

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 int ma[410][410]={0},vis[410][410],dist[410][410],mb[410][410];//mb储存数字,ma储存素数
 5 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
 6 int q[410*410];//队列数组
 7 int isprime(int n)
 8 {
 9     int i;if(n==1)return 0;
10     for(i=2;i<=(int)sqrt((double)n);i++)
11         if(n%i==0)return 0;
12     return 1;
13 }
14 void jx()//建立矩形,大小为400*400
15 {
16     memset(ma,0,sizeof(ma));
17     int i=0,j,key=160000;
18     while(key>=1){
19         for(j=i;j<400-i-1;j++){//从左向右
20             mb[i][j]=key--;if(isprime(mb[i][j]))ma[i][j]=key+1;
21         }
22         for(j=i;j<400-i-1;j++){//从上往下
23             mb[j][400-i-1]=key--;if(isprime(mb[j][400-i-1]))ma[j][400-i-1]=1+key;
24         }
25         for(j=400-i-1;j>i;j--){//从右往左
26             mb[400-1-i][j]=key--;if(isprime(mb[399-i][j]))ma[399-i][j]=1+key;
27         }
28         for(j=400-1-i;j>i;j--){//从下往上
29             mb[j][i]=key--;if(isprime(mb[j][i]))ma[j][i]=1+key;
30         }
31         i++;
32     }
33 }
34 void bfs(int x,int y,int nn)//,BFS搜索,nn是目标数据
35 {
36     memset(vis,0,sizeof(vis));//标记数组,先全部清0
37     memset(dist,0,sizeof(dist));//距离数组,记录每一点到初始位置的距离
38     memset(q,0,sizeof(q));//队列数组
39     vis[x][y]=1;
40     int u=x*400+y;
41     int front=0,rear=0;
42     q[rear++]=u;
43     while(front<rear)
44     {
45         u=q[front++];//取队列头位置的数
46         x=u/400;y=u%400;
47         for(int i=0;i<4;i++)
48         {
49             int nx=x+dx[i],ny=y+dy[i];
50             if(nx>=0&&nx<400&&ny>=0&&ny<400&&!ma[nx][ny]&&!vis[nx][ny])
51             {
52                 vis[nx][ny]=1;
53                 q[rear++]=nx*400+ny;//放入队列尾
54                 dist[nx][ny]=dist[x][y]+1;//距离加1
55                 if(mb[nx][ny]==nn)return;//一旦找到立刻停止搜索
56             }
57         }
58     }
59 }
60 int main()
61 {
62     jx();
63     int m,n,num=1;
64     while(~scanf("%d%d",&m,&n))
65     {
66         int x,y,xx,yy,count=0;
67         printf("Case %d: ",num++);
68         for(int i=0;count<2&&i<400;i++)//找到开始的位置
69             for(int j=0;j<400;j++)
70             {
71                 if(mb[i][j]==m)x=i,y=j,count++;
72                 if(mb[i][j]==n)xx=i,yy=j,count++;
73             }
74         bfs(x,y,n);//搜索
75         if(dist[xx][yy])printf("%d\n",dist[xx][yy]);
76         else printf("impossible\n");
77     }
78     return 0;
79 }

 

转载于:https://www.cnblogs.com/gj-Acit/archive/2013/02/10/2909812.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值