zoukankan      html  css  js  c++  java
  • HDU-4255

    A Famous Grid

    Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1496    Accepted Submission(s): 567


    Problem Description
    Mr. B has recently discovered the grid named "spiral grid".
    Construct the grid like the following figure. (The grid is actually infinite. The figure is only a small part of it.)


    Considering traveling in it, you are free to any cell containing a composite number or 1, but traveling to any cell containing a prime number is disallowed. You can travel up, down, left or right, but not diagonally. Write a program to find the length of the shortest path between pairs of nonprime numbers, or report it's impossible.
     
    Input
    Each test case is described by a line of input containing two nonprime integer 1 <=x, y<=10,000.
     
    Output
    For each test case, display its case number followed by the length of the shortest path or "impossible" (without quotes) in one line.
     
    Sample Input
    1 4
    9 32
    10 12
     
    Sample Output
    Case 1: 1
    Case 2: 7
    Case 3: impossible
     
    Source
    /**       
              题意:给出两个数,问两点之间的最短距离
              做法:蛇形矩阵 + bfs + 优先队列
    **/
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    #include <algorithm>
    #include <string.h>
    #include <queue>
    #define maxn 40000
    using namespace std;
    int mmap[200][200];
    int a[200][200];
    int vis[200][200];
    int dx[4] = {0,0,-1,1};
    int dy[4] = {1,-1,0,0};
    int n,m;
    bool num[maxn];
    void is_prime()
    {
        int tot = 0;
        memset(num,false,sizeof(num));
        num[1] = true;
        for(long long  i=2; i<maxn; i++)
        {
            if(!num[i])
            {
                for(long long j=i*i; j<=maxn; j+=i)
                {
                    num[j] = true;
                }
            }
        }
    }
    struct Node
    {
        int x;
        int y;
        int step;
        Node() {}
        Node(int _x,int _y,int _step)
        {
            x = 0;
            y = 0;
            step =0;
        }
    } start,endd;
    struct cmp
    {
        bool operator () (const Node &a,const Node &b)
        {
            return a.step>b.step;
        }
    };
    int check(int x,int y)
    {
        if(x>=0 && x <200 && y >= 0 && y < 200 && num[a[x][y]] == true&& !vis[x][y]) return 1;
        return 0;
    }
    priority_queue<Node,vector<Node>,cmp >que;
    bool bfs()
    {
        memset(vis,0,sizeof(vis));
        Node tmp,now;
        while(!que.empty()) que.pop();
        que.push(start);
        vis[start.x][start.y] = 1;
        start.step = 0;
        while(!que.empty())
        {
            now = que.top();
            que.pop();
            //cout<<now.x<<"   "<<now.y<<"   "<<now.step<<endl;
            if(now.x == endd.x && now.y == endd.y)
            {
                endd.step = now.step;
                return true;
            }
            for(int i=0; i<4; i++)
            {
                tmp.x = now.x + dx[i];
                tmp.y = now.y + dy[i];
                tmp.step = now.step + 1;
                if(check(tmp.x,tmp.y))
                {
                    vis[tmp.x][tmp.y] = 1;
                    que.push(tmp);
                }
            }
        }
        return false;
    }
    void init()
    {
        int x = 0;
        int y = 0;
        int nn = 200;
        int num=a[0][0]=40000;
        while(num>1)
        {
            while((y+1)<nn&&!a[x][y+1])  a[x][++y]= --num;
            while((x+1)<nn&&!a[x+1][y])  a[++x][y]= --num;
            while((y-1)>=0&&!a[x][y-1]) a[x][--y]= --num;
            while((x-1)>=0&&!a[x-1][y]) a[--x][y]= --num;
    
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        init();
        is_prime();
        int Case = 1;
        while(~scanf("%d %d",&n,&m))
        {
            for(int i=0; i<200; i++)
            {
                for(int j=0; j<200; j++)
                {
                    if(a[i][j] == n)
                    {
                        start.x = i;
                        start.y = j;
                    }
                    if(a[i][j] == m)
                    {
                        endd.x= i;
                        endd.y = j;
                    }
                }
            }
            bool prime = false;
            prime = bfs();
            printf("Case %d: ",Case++);
            if(prime) printf("%d
    ",endd.step);
            else printf("impossible
    ");
        }
        return 0;
    }
     
  • 相关阅读:
    zookeeper分布式锁和服务优化配置
    【转】从Mac/OS和iOS开放源码浅谈UNIX家谱
    【转】深入了解CPU两大架构ARM与X86
    【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的
    栈,寄存器,局部变量,内存,语言级别优化程序的方法
    在coursera上有哪些值得推荐的课程
    【转】楼天城楼教主的acm心路历程(作为励志用)
    硬中断软中断
    CPU GPU FPU TPU 及厂商
    C#中使用DLL相关问题
  • 原文地址:https://www.cnblogs.com/chenyang920/p/4492808.html
Copyright © 2011-2022 走看看