|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <iostream>
#include <malloc.h>
#include <math.h>
using namespace std;
typedef struct pnode *position;
struct pnode {int row ,col;position next;}Pnode;
typedef struct lque *Queue;
typedef struct lque{
position front;
position rear;
}Lqueue;
Queue Queueinit()
{
Queue Q=(Queue)malloc(sizeof*Q);
Q->front=Q->rear=0;
return Q;
}
position newposition()
{
position p;
p=(position)malloc(sizeof(Pnode));
return p;
}
void enterQueue(position p,Queue Q)
{
p->next=0;
if (Q->front)Q->rear->next=p;
else Q->front=p;
Q->rear=p;
}
position deleteQueue(Queue Q)
{
position p;
p=Q->front;
Q->front=Q->front->next;
return p;
}
int judge(int a)
{
if (a==1||a==2)
{
return 1;
}
if (a==0)
{
return 2;
}
int i,k;
k=sqrt(a);
for (i=2;i<=k+1;i++)
{
if (a%i==0)
{
return 0;
}
}
return 1;
}
int **malloc2d(int r,int c)
{
int i;
int **t=(int **)malloc(r*sizeof(int *));
for (i=0;i<r;i++)
{
t[i]=(int *)malloc(c*sizeof(int));
}
return t;
}
int findpath(position start,position finish,int **ar,int x,int y)
{ Queue Q;
Q=Queueinit();
int i,k,len;
position here,nbr,offset[4];
for (i=0;i<=y+1;i++)
{
ar[0][i]=ar[x+1][i]=1;
}
for (i=0;i<=x+1;i++)
{
ar[i][0]=ar[i][y+1]=1;
}
for (i=0;i<4;i++)
{
offset[i]=newposition();
}
offset[0]->row=0;offset[0]->col=1;
offset[1]->row=1;offset[1]->col=0;
offset[2]->row=0;offset[2]->col=-1;
offset[3]->row=-1;offset[3]->col=0;
k=4;
here=newposition();
here->row=start->row;
here->col=start->col;
while (1)
{
for (i=0;i<k;i++)
{
nbr=newposition();
nbr->row=here->row+offset[i]->row;
nbr->col=here->col+offset[i]->col;
if (ar[nbr->row][nbr->col]==0)
{
ar[nbr->row][nbr->col]=ar[here->row][here->col]+1;
if ((nbr->row==finish->row)&&(nbr->col==finish->col))break;
enterQueue(nbr,Q);
}
}
if ((nbr->row==finish->row)&&(nbr->col==finish->col))break;
here=deleteQueue(Q);
}
len=ar[finish->row][finish->col]-2;
return len;
}
int main()
{
int i,j,x,y,len;
cin>>x>>y;
position start=newposition();
position finish=newposition();
int **ar=malloc2d(x+2,y+2);
for (i=1;i<=x;i++)
{
for (j=1;j<=y;j++)
{
cin>>ar[i][j];
if (ar[i][j]==0)
{
start->row=i;
start->col=j;
}
if (ar[i][j]==1)
{
finish->row=i;
finish->col=j;
}
ar[i][j]=judge(ar[i][j]);
}
}
len=findpath(start,finish,ar,x,y);
cout<<len<<endl;
return 0;
}
该题题目是在一个二维数组有0,1两个数,0是出发点,1是目的地,如果遇到素数则代表不能通过,否则可以通过,前进一格+1,问从出发点到目的地要多少步,如果走不通,则没有结果 |
|