Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用朴素的方法也能过,用标准库的queue也能过滴#include<iostream> #include<queue> #include<algorithm> using namespace std; const int MAXN=21; int map[MAXN][MAXN]; int snake[MAXN][MAXN][20000]; const int dir1[4][2]={-1,0,0,1,1,0,0,-1}; const int dir2[4]={0,3,2,1}; struct Node{ int x,y,c,state; bool operator < (Node other)const{ return c+x+y>other.c+other.x+other.y; } }; queue<Node> q; int n,m,k; int code(int a[]) { int state=0; for(int i=0;i<k-1;i++) state=state*4+a[i]; return state; } void encode(int state,int s[]) { for(int i=k-2;i>=0;i--) { s[i]=state%4; state/=4; } } int bfs() { Node now; int state[8]; int i,j,x,y,tmpx,tmpy,c,s; while(!q.empty()) { tmpx=x=q.front().x;tmpy=y=q.front().y; c=q.front().c;s=q.front().state; q.pop(); if(x==1&&y==1)return c; encode(s,state); for(j=0;j<k-1;j++) { switch(state[j]) { case 0:{map[x+1][y]=1;x+=1;break;} case 1:{map[x][y+1]=1;y+=1;break;} case 2:{map[x-1][y]=1;x-=1;break;} case 3:{map[x][y-1]=1;y-=1;break;} } } for(j=k-2;j>=1;j--)state[j]=state[j-1]; x=tmpx;y=tmpy; for(i=0;i<4;i++) { now.x=x+dir1[i][0]; now.y=y+dir1[i][1]; now.c=c+1; if(now.x<1||now.x>n||now.y<1||now.y>m)continue; if(map[now.x][now.y]==1)continue; state[0]=dir2[i]; now.state=code(state); if(snake[now.x][now.y][now.state]==-1||now.c<snake[now.x][now.y][now.state]) { snake[now.x][now.y][now.state]=now.c; q.push(now); } } encode(s,state); for(j=0;j<k-1;j++) { switch(state[j]) { case 0:{map[x+1][y]=0;x+=1;break;} case 1:{map[x][y+1]=0;y+=1;break;} case 2:{map[x-1][y]=0;x-=1;break;} case 3:{map[x][y-1]=0;y-=1;break;} } } } return -1; } int main()//0下1右2上3左 { int i,j,stone,x,y,t=1; Node init[8], now; int first[8]; while(scanf("%d%d%d",&n,&m,&k)==3,n&&m&&k) { memset(snake,-1,sizeof(snake)); memset(map,0,sizeof(map)); for(i=0;i<k;i++)scanf("%d%d",&init[i].x,&init[i].y); scanf("%d",&stone); for(i=0;i<stone;i++) { scanf("%d%d",&x,&y); map[x][y]=1; } for(i=1;i<k;i++) { if(init[i].x==init[i-1].x&&init[i].y==init[i-1].y+1) first[i-1]=1; else if(init[i].x==init[i-1].x&&init[i].y==init[i-1].y-1) first[i-1]=3; else if(init[i].x==init[i-1].x+1&&init[i].y==init[i-1].y) first[i-1]=0; else if(init[i].x==init[i-1].x-1&&init[i].y==init[i-1].y) first[i-1]=2; } int fstate=code(first); while(!q.empty())q.pop(); now.x=init[0].x;now.y=init[0].y;now.c=0;now.state=fstate; snake[now.x][now.y][fstate]=0; q.push(now); printf("Case %d: %d\n",t++,bfs()); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator