SPOJ Problem Set (classical) 11582. A Famous Grid

来源:互联网 发布:license.lic 破解软件 编辑:程序博客网 时间:2024/04/29 10:32
//螺旋数,很多时候不是你不会,是对未知的东西充满了恐惧//其实静下心来,这个螺旋数是完全可以写出来的,剩下的就是简单的bfs了//PS:图是无限大的,虽然x,y给出的范围是10000,也就是100*100的图,但是可以绕着走,所以要稍微开大一点儿#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int maxn=104;int a,b;int map[maxn+10][maxn+10],tt;struct in{int x,y;int cnt;}p[maxn*maxn+100],que[maxn*maxn+100],start,p0,p1;int prim[maxn*maxn+100]={0};int vis[maxn+10][maxn+10]={0};int path[maxn+10][maxn+10];void deal()//螺旋数的构造,从外向内,思维很直观,所以思考很重要,不能因为陌生而放弃 {  int l,r,u,d,now=maxn*maxn;  l=1,r=maxn,u=1,d=maxn;  while(now>0)  {      for(int i=l;i<=r;i++)      {          map[u][i]=now;          p[now].x=u;          p[now].y=i;          now--;      }      u++;      for(int i=u;i<=d;i++)      {          map[i][r]=now;          p[now].x=i;          p[now].y=r;          now--;      }      r--;      for(int i=r;i>=l;i--)      {          map[d][i]=now;          p[now].x=d;          p[now].y=i;          now--;      }      d--;      for(int i=d;i>=u;i--)      {          map[i][l]=now;          p[now].x=i;          p[now].y=l;          now--;      }      l++;  }}void deal2(){int i,j,n=maxn*maxn;prim[1]=1;for(i=2;i<=n;i++)if(prim[i]==0){for(j=i+i;j<=n;j+=i)prim[j]=1;}}int findx[][2]={{0,-1},{0,1},{-1,0},{1,0}};int f;int bfs(int t,int s){    if(prim[t]==0||prim[s]==0)    return -1;    else if(s==t)    return 0;    else    {        queue <in> que;        que.push(start);        while(!que.empty())        {            p0=que.front();            que.pop();            for(int i=0;i<4;i++)            {            //cout<<tt<<endl;                int nextx=p0.x+findx[i][0];                int nexty=p0.y+findx[i][1];                int xx=map[nextx][nexty];                if(nextx<1 || nextx>maxn || nexty<1 || nexty>maxn) continue;  if(vis[nextx][nexty]==1) continue;   if(prim[xx]==0) continue;     vis[nextx][nexty]=1;                    p1.x=nextx;                    p1.y=nexty;                    p1.cnt=p0.cnt+1;                    if(p1.x==a&&p1.y==b)                    {                    f=1;                        return p1.cnt;                    }                    else                    {                                       que.push(p1);                    }                               }      }//cout<<f<<endl;        if(f==0)        return -1;     }                }int main(){int s,t,sum;tt=1;deal();deal2();while(~scanf("%d%d",&s,&t)){memset(vis,0,sizeof(vis));//每次初始化vis,以免之前的数据影响以后的,如果想省下初始化的时间,可以将vis每次的赋值为tt printf("Case %d: ",tt++);start.x=p[s].x;        start.y=p[s].y;        start.cnt=0;        vis[start.x][start.y]=1;         a=p[t].x,b=p[t].y;         f=0;sum=bfs(t,s);if(sum==-1) puts("impossible");else printf("%d\n",sum);}return 0;}

原创粉丝点击