题意:
给你一个矩阵,矩阵里是的数是这么安排的,然后给你两个数,让你求这两个数的最短距离,素数不能去;
思路:
预处理一下素数表,矩阵,然后找一下起点和终点的坐标,跑一下BFS就好了;
#include<stdio.h> #include<queue> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int INF=-0x3f3f3f3f; const int N=2e2+10; bool isprime[40010]; void sushu() { memset(isprime,0,sizeof(isprime)); isprime[1]=1; for(int i=2;i<=40000;i++) { if(isprime[i]) continue; for(int j=i+i;j<=40000;j+=i) isprime[j]=1; } } struct asd{ int x,y; }; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int step[N][N]; int ma[N][N]; int sx,sy,ex,ey; void init() { int i,j,m; i=j=0; memset(ma,0,sizeof(ma)); m=ma[0][0]=40000; while(m>1) { while(j+1<200&&ma[i][j+1]==0) ma[i][++j]=--m; while(i+1<200&&ma[i+1][j]==0) ma[++i][j]=--m; while(j-1>=0&&ma[i][j-1]==0) ma[i][--j]=--m; while(i-1>=0&&ma[i-1][j]==0) ma[--i][j]=--m; } } void BFS() { asd now,ne; queue<asd>q; memset(step,-1,sizeof(step)); now.x=sx; now.y=sy; step[sx][sy]=0; q.push(now); while(!q.empty()) { now=q.front(); q.pop(); if(now.x==ex&&now.y==ey) { printf("%d ",step[ex][ey]); return; } for(int i=0;i<4;i++) { int xx=dx[i]+now.x; int yy=dy[i]+now.y; if(xx<0||yy<0||xx>=200||yy>=200||step[xx][yy]!=-1||!isprime[ma[xx][yy]]) continue; step[xx][yy]=step[now.x][now.y]+1; ne.x=xx; ne.y=yy; q.push(ne); } } if(step[ex][ey]==-1) puts("impossible"); } int main() { int cas=1; sushu(); init(); int x,y; while(~scanf("%d%d",&x,&y)) { printf("Case %d: ",cas++); if(!isprime[x]||!isprime[y]) { puts("impossible"); continue; } for(int i=0;i<200;i++) for(int j=0;j<200;j++) { if(ma[i][j]==x) { sx=i; sy=j; } if(ma[i][j]==y) { ex=i; ey=j; } } BFS(); } return 0; }