• 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);
            }
        }
    }
  • 相关阅读:
    [野外实验] 塞罕坝遥感实验(2020.7-8月)
    [学术论文] 一时兴趣的产出(新型TLS布站策略)被TGRS录用
    c++11 新特性实战 (一):多线程操作
    用 Docker Swarm 来部署 Nebula Graph 集群
    用图机器学习探索 A 股个股相关性变化
    图数据库对比:Neo4j vs Nebula Graph vs HugeGraph
    【程序人生】25岁,一位女程序员的幸运几年
    【开发总结】order by 为什么没有走索引?
    【故障总结】CPU飙升?我写的?
    mysql比现实时间少了八小时
  • 原文地址:https://www.cnblogs.com/lipu123/p/13658364.html
Copyright © 2020-2023  润新知