hdu 4255(模拟+bfs)

点击打开链接


好恶心的一道题,

给你x,y都小于等于10000,但是可以通过这个范围之外的点走。。。。开到200就可以了。。


写的很乱。。。

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
using namespace std;
#define N 400
int map[N][N];
int prime[N*N];
int mark[40001];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
struct node
{
	int x,y,t;
}p,q;
int judge(int x,int y)
{
	if(x>=1&&y<=400&&y>=1&&y<=400&&prime[map[x][y]]==1)
		return 1;
	return 0;
}
int s,e;
int sx,sy;
int ex,ey;
void init()
{
	memset(map,0,sizeof(map));
	int i,j,k,t,l,o;
	i=200;j=200;
	map[i][j]=1;
	k=2;t=0;l=0;
	while(k<=40000)
	{
		if(t==0)
		{
			l++;
			o=1;
			while(o<=l)
			{
				map[i][j+o]=k++;
				o++;
			}
			o--;
			j=j+o;
		}
		else if(t==1)
		{
			o=1;
			while(o<=l)
			{
				map[i-o][j]=k++;
				o++;
			}
			o--;
			i=i-o;
		}
		else if(t==2)
		{
			l++;
			o=1;
			while(o<=l)
			{
				map[i][j-o]=k++;
				o++;
			}
			o--;
			j=j-o;
		}
		else 
		{
			o=1;
			while(o<=l)
			{
				map[i+o][j]=k++;
				o++;
			}
			o--;
			i=i+o;
		}
		if(k>40000)break;
		t++;
		t%=4;
	}
	/*
	printf("%d\n",k);
	for(i=190;i<=210;i++)
	{
		for(j=190;j<=210;j++)
			printf("%6d",map[i][j]);
		printf("\n");
	}
	*/
}
void fun()
{
	memset(prime,0,sizeof(prime));
	prime[1]=1;
	int i,j;
	for(i=2;i<=40000;i++)
	{
		if(!prime[i])
			for(j=i+i;j<=40000;j+=i)
				prime[j]=1;
	}
}

void bfs()
{
	int i,x,y;
	queue<node>Q;
	p.x=sx;
	p.y=sy;
	p.t=0;
	Q.push(p);
	memset(mark,0,sizeof(mark));
	mark[map[sx][sy]]=1;
	while(!Q.empty())
	{
		p=Q.front();
		Q.pop();
		if(p.x==ex&&p.y==ey)
		{
			printf("%d\n",p.t);
			return ;
		}
		for(i=0;i<4;i++)
		{
			x=q.x=p.x+dir[i][0];
			y=q.y=p.y+dir[i][1];
			if(judge(x,y)&&mark[map[x][y]]==0)
			{
				mark[map[x][y]]=1;
				q.t=p.t+1;
				Q.push(q);
			}
		}
	}
	printf("impossible\n");
}

int main()
{
	memset(map,0,sizeof(map));
	init();
	fun();
	int t=1;
	while(scanf("%d%d",&s,&e)!=-1)
	{
		int i,j;
		sx=sy=0;
		ex=ey=0;
		for(i=1;i<=400;i++)
		{
			for(j=1;j<=400;j++)
			{
				if(map[i][j]==s&&!sx&&!sy)sx=i,sy=j;
				if(map[i][j]==e&&!ex&&!ey)ex=i,ey=j;
			}
		}
	//	printf("%d %d\n",sx,sy);
	//	printf("%d %d\n",ex,ey);
		printf("Case %d: ",t++);
		bfs();
	}
	return 0;
}
		


你可能感兴趣的:(HDU,bfs)