BFS+螺旋矩阵

B先生最近发现了名为“螺旋网格”的网格。
如下图所示构建网格。(网格实际上是无限的。该图只是其中的一小部分。)



考虑到在其中旅行,您可以自由使用任何包含复数或1的单元格,但不允许旅行到包含质数的任何单元格。您可以向上,向下,向左或向右行驶,但不能沿对角线行驶。编写程序以查找成对的非素数之间的最短路径的长度,或者报告这是不可能的。

 
输入项
每个测试用例都由包含两个非素数整数1 <= x,y <= 10,000的输入行描述。
 
输出量
对于每个测试用例,在一行中显示其用例编号,后跟最短路径或“不可能”(不带引号)的长度。
 
题意:
就是给你两个数,在一个螺旋矩阵中只能走不是素数的格子,问你走过去的最短路,如果不能走过去就输出impossible
 
解法:
就是BFS+螺旋矩阵
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxx=6e4+10;
int map[301][301];
int vis[300][300];
int biaoji[maxx];
const int maxn=5e4+100;
//void getprime(){
//    memset(prime,1,sizeof(prime));
//    prime[1]=0;
//    for(int i=2;i<40010;i++){
//        if(prime[i]){
//            for(int j=i*i;j<40010;j+=i){
//                prime[j]=0;
//            }
//        }
//    }
//}
void getprime(){
    memset(biaoji,1,sizeof(biaoji));
    biaoji[1]=0;
    for(int i=2;i<40010;i++)
        if(biaoji[i])
            for(int j=i*i;j<40010;j+=i)
                biaoji[j]=0;
}
void get(){
    int c=40000;
    int x=1,y=200,a=1,b=200;
    while(c>0){
        for(int i=x;i<=y;i++){
            map[x][i]=c--;
        }
        x++;
        for(int i=x;i<=y;i++){
            map[i][y]=c--;
        }
        y--;
        for(int i=y;i>=a;i--){
            map[b][i]=c--;
        }
        b--;
        for(int i=b;i>a;i--){
            map[i][a]=c--;
        }
        a++; 
    } 
}
struct node{
    int x,y,st;
};  
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int X,Y;
int dfs(int si,int sj,int c){
    memset(vis,0,sizeof(vis));
    queue<node>q;
    node now,tmp;
    now.x=si,now.y=sj,now.st=c;
    vis[si][sj]=1;
    if(map[now.x][now.y]==Y){
        return now.st;
    }
    q.push(now);
    while(!q.empty()){
        tmp=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            now.x=tmp.x+dx[i];
            now.y=tmp.y+dy[i];
            now.st=tmp.st+1;
            if(now.x<1||now.x>200||now.y<1||now.y>200||biaoji[map[now.x][now.y]]||vis[now.x][now.y]) continue;
            if(map[now.x][now.y]==Y){
                return now.st;
            }
            vis[now.x][now.y]=1;
            q.push(now);
        }
    }
    return -1;
}
int main(){
    getprime();
    get();
    int si,sj;
    int Case=0;
    while(~scanf("%d%d",&X,&Y)){
        int flag=1;
        for(int i=1;i<=200&&flag;i++){
            for(int j=1;j<=200&&flag;j++){
                if(map[i][j]==X){
                    si=i;
                    sj=j;
                    flag=0;
                }
            } 
        }
        int ans=dfs(si,sj,0);
        if(ans!=-1){
            printf("Case %d: %d
",++Case,ans);
        } 
        else{
            printf("Case %d: impossible
",++Case);
        }
    }
}
原文地址:https://www.cnblogs.com/lipu123/p/13658364.html