hdu 4255 A Famous Grid (模拟+广搜)

来源:互联网 发布:九章算法基础班视频 编辑:程序博客网 时间:2024/05/16 04:39
#include<stdio.h>#include<string.h>#include<queue>using namespace std;int map[1009][1009],mark[1009][1009];int a[1000001],xx,yy;int dist[4][2]={0,1,0,-1,1,0,-1,0};struct node {   int x,y,step;};void grap(){   int c=1000000,x,y,z,b,i;   x=1;y=1000;z=1;b=1000;   while(c>0)   {       for(i=x;i<=y;i++)           map[x][i]=c--;       x++;       for(i=x;i<=y;i++)           map[i][y]=c--;       y--;       for(i=y;i>=z;i--)           map[b][i]=c--;       b--;       for(i=b;i>z;i--)           map[i][z]=c--;       z++;   }}void prim(){   int i,j;   memset(a,0,sizeof(a));   a[1]=1;   for(i=2;i<=1000000;i++)       if(a[i]==0)           for(j=2;i*j<=1000000;j++)               a[i*j]=1;}int bfs(int aa,int bb){   queue<node>q;   node cur,next;   cur.x=aa;   cur.y=bb;   cur.step=0;   mark[aa][bb]=1;   if(map[cur.x][cur.y]==yy)return cur.step;   q.push(cur);   while(!q.empty())   {       cur=q.front();       q.pop();       for(int i=0;i<4;i++)       {           next.x=cur.x+dist[i][0];           next.y=cur.y+dist[i][1];           if(next.x>=1&&next.y>=1&&next.x<=1000&&next.y<=1000&&mark[next.x][next.y]==0&&a[map[next.x][next.y]]==1)           {                   next.step=cur.step+1;                   if(map[next.x][next.y]==yy&&a[map[next.x][next.y]]==1)return next.step;                   mark[next.x][next.y]=1;                   q.push(next);           }       }   }   return -1;}int main(){   int i,j,a,b,z=1;   prim();   grap();   while(scanf("%d%d",&xx,&yy)!=-1)   {       for(i=1;i<=1000;i++)       {           for(j=1;j<=1000;j++)               if(map[i][j]==xx)               {                   a=i;                   b=j;                   break;               }               if(j<=1000)                   break;       }       memset(mark,0,sizeof(mark));       int ans=bfs(a,b);       if(ans==-1)           printf("Case %d: impossiblen",z++);       else           printf("Case %d: %dn",z++,ans);   }   return 0;}

原创粉丝点击