hdu 4255 A Famous Grid--模拟--筛素数--bfs

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int s,t;

struct node
{
    int x,y;
}shu[40001];
node ss,tt;
int suy[40001];
int map[201][201];
int fang[201];
void inif()//计算平方数
{
    for(int i=1;i<=200;i++)
        fang[i]=i*i;
}
void xu(int i)//计算数字i的位置
{
    int l,r;
    for(r=2;r<=200;++r)
        if(i<fang[r])
            break;
    l=r-1;
    if(l%2)
    {
        if((i-l*l)<=(r*r-l*l)/2)
        {
            shu[i].x=shu[l*l].x-(i-l*l)+1;
            shu[i].y=shu[l*l].y+1;
        }else
        {
            shu[i].x=shu[r*r].x;
            shu[i].y=shu[r*r].y+r*r-i;
        }
    }else
    {
        if((i-l*l)<=(r*r-l*l)/2)
        {
            shu[i].x=shu[l*l].x+i-l*l-1;
            shu[i].y=shu[l*l].y-1;
        }else
        {
            shu[i].x=shu[r*r].x;
            shu[i].y=shu[r*r].y-(r*r-i);
        }
    }
}
void ini()//初始化
{
    inif();
    int i,ju;
    shu[1].x=101;
    shu[1].y=100;
    shu[4].x=100;
    shu[4].y=100;
    for(i=3;i<=200;i++)
    {
        if(i%2)
        {
            ju=(i-1)/2;
            shu[i*i].x=shu[1].x+ju;
            shu[i*i].y=shu[1].y+ju;
        }else
        {
            ju=(i-2)/2;
            shu[i*i].x=shu[4].x-ju;
            shu[i*i].y=shu[4].y-ju;
        }
    }
    for(i=2;i<=40000;++i)
        if(shu[i].x==0)
            xu(i);
}    
void su()//筛素数
{
    int i,j;
    memset(suy,0,sizeof(suy));
    suy[1]=1;
    for(i=2;i<=200;i++)
    {
        if(suy[i]==0)
        {
            for(j=i+i;j<=40000;j=j+i)
                suy[j]=1;//和数为1
        }
    }
    memset(map,0,sizeof(map));
}
struct qnode
{
    int x,y,n;
};
int v[200][200];
int dir[][2]={-1,0,0,1,1,0,0,-1};
int dfs()//找最短路
{
    int k;
    queue<qnode>q;
    qnode cur,next;
    cur.x=ss.x;
    cur.y=ss.y;
    cur.n=0;
    memset(v,0,sizeof(v));
    v[cur.x][cur.y]=1;
    q.push(cur);
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        for(k=0;k<4;k++)
        {
            next.x=cur.x+dir[k][0];
            next.y=cur.y+dir[k][1];
            next.n=cur.n+1;
            if(next.x==tt.x&&next.y==tt.y)
                return next.n;
            if(next.x>=1&&next.x<=200&&next.y>=1&&next.y<=200&&map[next.x][next.y]==0&&v[next.x][next.y]==0)
            {
                v[next.x][next.y]=1;
                q.push(next);
            }
        }
    }
    return -1;
}
void biaosu()//标记素数
{
    int i,x,y;
    for(i=1;i<=40000;++i)
    {
        if(!suy[i])
        {
            x=shu[i].x;
            y=shu[i].y;
            map[x][y]=1;
        }
    }
}
int main()
{
    int ret,cas=1;
    ini();
    su();
    biaosu();
    while(scanf("%d%d",&s,&t)!=EOF)
    {
        ss=shu[s];
        tt=shu[t];
        ret=dfs();
        if(ret==-1)
            printf("Case %d: impossible\n",cas++);
        else printf("Case %d: %d\n",cas++,ret);
    }
    return 0;
}


你可能感兴趣的:(struct,ini)