⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k.cpp

📁 ACM World Final 2008题目程序代码
💻 CPP
字号:
#include <cstdio>
#include <cstring>
using namespace std;

const int ed[4][3]={{0,0,0},{-1,0,0},{0,0,1},{0,-1,1}};
const int vd[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int mr,mc,sr,sc,tr,tc,e[110][110][2];
int dis[110][110][4][2];

const int M=131072;
struct qnode
{
	int r,c,d,f;
	qnode& operator()(int r_,int c_,int d_,int f_)
	{
		return r=r_,c=c_,d=d_,f=f_,*this;
	}
	void dealnode();
} q[M];
int qs,qt;
bool inq[110][110][4][2];

void addnode(int r,int c,int d,int f,int dis_)		
{
	dis[r][c][d][f]=dis_;
	if(bool &inqn=inq[r][c][d][f])return;
	else inqn=true;
	int dis_s=dis[q[qs].r][q[qs].c][q[qs].d][q[qs].f];
	if(dis_>dis_s)q[qt](r,c,d,f),qt=qt+1&M-1;
	else q[qs=qs-1&M-1](r,c,d,f);
}

void qnode::dealnode()
{
	int disn=dis[r][c][d][f];
	int rb=r-vd[d][0]+ed[d][0],cb=c-vd[d][1]+ed[d][1];
	int eb=e[rb][cb][ed[d][2]];
	for(int i=0;i<4;++i)
		if(e[r+ed[i][0]][c+ed[i][1]][ed[i][2]])
		{
			bool f1=d!=i;
			int dis1=disn+(eb<<(f|f1)),r1=r+vd[i][0],c1=c+vd[i][1];
			if(dis1<dis[r1][c1][i][f1])addnode(r1,c1,i,f1,dis1);
		}
	inq[r][c][d][f]=false;
}

int main()
{
	for(int te=1;scanf("%d %d",&mr,&mc),mr;++te)
	{
		scanf("%d %d %d %d",&sr,&sc,&tr,&tc);
		memset(e,0,sizeof(e));
		for(int i=1;;++i)
		{
			for(int j=1;j<mc;++j)
				scanf("%d",&e[i][j][1]);
			if(i==mr)break;
			for(int j=1;j<=mc;++j)
				scanf("%d",&e[i][j][0]);
		}
		memset(dis,0x7F,sizeof(dis));
		memset(inq,0,sizeof(inq));
		qs=qt=q[0].r=q[0].c=q[0].d=q[0].f=0;
		for(int i=0;i<4;++i)
			if(e[sr+ed[i][0]][sc+ed[i][1]][ed[i][2]])
				addnode(sr+vd[i][0],sc+vd[i][1],i,1,0);
		while(qs!=qt)
		{
			qnode x(q[qs]);
			qs=qs+1&M-1;
			x.dealnode();
		}
		int ans=~0U>>1;
		for(int i=0;i<4;++i)for(int j=0;j<2;++j)
			if(int ce=e[tr+ed[i][0]][tc+ed[i][1]][ed[i][2]])
				if((ce+=ce+dis[tr][tc][i^1][j])<ans)ans=ce;
		if(ans>>30)printf("Case %d: Impossible\n",te);
		else printf("Case %d: %d\n",te,ans);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -