HDU 4255(蛇形填数+BFS+优先队列)


这个题目把代码打完以后,真心觉得蛋疼。不知道改了多久,构建的蛇形二维数组一直有问题。。。

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int q[150][150],w[30000],r[150][150];
int n,m;
int c,d;

struct node{
	int a,b;
	int pri;
	bool operator<(const node &t) const{
		return pri>t.pri;
	}
};

int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int bfs(int x,int y){
	priority_queue<node> que;
	node in,out;
	int e,f,i;
	in.a=x;
	in.b=y;
	in.pri=0;
	r[x][y]=1;
	que.push(in);
	while(que.size() != 0){
		out=que.top();
		que.pop();
		if(out.a==c && out.b == d){
			return out.pri;
		}
		for(i=0;i<4;i++){
			e=out.a+dir[i][0];
			f=out.b+dir[i][1];
			if(q[e][f]!=0 && r[e][f]==0&&e>=0 &&f>=0 &&e<150 &&f<150 && w[q[e][f]]==1){
				in.a=e;
				in.b=f;
				in.pri=out.pri+1;
				r[e][f]=1;
				que.push(in);
			}
		}
	}
	return 0;
}
int main(){
	int i,j,ant,sum;
	int a,b;
	memset(q,-1,sizeof(q));
	memset(w,0,sizeof(w));
	w[1]=1;
	for(i=2;i<=150;i++){
		if(w[i]==0)
		for(j=2*i;j<=25000;j=j+i){
			w[j]=1;
		}
	}
	ant=22499;
	q[0][0]=22500;
	i=0;j=0;

	while(ant>=1){  //这个蛇形填数第一次使用,记住吧!!!
		while(j+1<150 && q[i][j+1]==-1){
			q[i][++j]=ant;
			ant--;
		}
		while(i+1<150 && q[i+1][j]==-1){
			q[++i][j]=ant;
			ant--;
		}
		while(j-1>=0 && q[i][j-1]==-1){
			q[i][--j]=ant;
			ant--;
		}
		while(i-1>=0 && q[i-1][j]==-1){
			q[--i][j]=ant;
			ant--;
		}
	}
	//printf("_____%d\n",q[i][j]);
	ant=1;
	while(~scanf("%d%d",&n,&m)){
		memset(r,0,sizeof(r));
		for(i=0;i<150;i++){
			for(j=0;j<150;j++){
				if(q[i][j] == n){
					a=i;
					b=j;
				}
				if(q[i][j] == m){
					c=i;
					d=j;
				}
			}
		}
		//printf("%d %d %d %d\n",a,b,c,d);
		sum=bfs(a,b);
		printf("Case %d: ",ant++);
		if(sum == 0) printf("impossible\n");
		else printf("%d\n",sum);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值