vijosP1879 小岛的贪吃蛇 BFS

来源:互联网 发布:茶之为饮 发乎神农氏 编辑:程序博客网 时间:2024/04/29 18:33

BFS 队列要手动开到1e6 (巨坑)。

#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <map>#include <cstdio>#include <queue>using namespace std;int n,m,l,T;int vis[30][30][18000];int tab[30][30];int dx[]={0,1,-1,0};int dy[]={1,0,0,-1};struct node{    int step;    int x[15],y[15];}start,q[1010000];void init(){    for(int i=1;i<=l;i++)    {        scanf("%d%d",&start.x[i],&start.y[i]);    }    int x,y;    scanf("%d",&T);    for(int i=1;i<=T;i++)    {        scanf("%d%d",&x,&y);        tab[x][y]=1;    }}bool judge(int x,int y){    if(x>0&&x<=n&&y>0&&y<=m)    {        return true;    }    return false;}int get(node a){    int tmp=0;    for(int i=1;i<l;i++)    {        for(int j=0;j<4;j++)        {            if((a.x[i]+dx[j]==a.x[i+1]) && (a.y[i]+dy[j]==a.y[i+1]))            {                tmp=tmp*4+j;                break;            }        }    }    return tmp;}node change(node a,int x,int y){    node tmp;    tmp.step=a.step+1;    tmp.x[1]=x;    tmp.y[1]=y;    for(int i=2;i<=l;i++)    {        tmp.x[i]=a.x[i-1];        tmp.y[i]=a.y[i-1];    }    return tmp;}int bfs(){    node now,next;    int xx,yy,tot;    start.step=0;    int head=0,tail=1;    if(tab[1][1]==1)    {        return -1;    }    q[++tail]=start;    vis[start.x[1]][start.y[1]][get(start)]=1;    while(head<tail)    {        head++;        now=q[head];        if(now.x[1]==1&&now.y[1]==1)        {            return now.step;        }        for(int i=0;i<4;i++)        {            int flag=0;            xx=now.x[1]+dx[i];            yy=now.y[1]+dy[i];            if(!judge(xx,yy)) continue;            for(int j=1;j<=l;j++)            {                if(xx==now.x[j]&&yy==now.y[j])                {                    flag=1;                    break;                }            }            if(tab[xx][yy]) continue;            if(flag) continue;            next=change(now,xx,yy);            int sum=get(next);            if(vis[next.x[1]][next.y[1]][sum])                continue;            vis[next.x[1]][next.y[1]][sum]=1;                        tail++;            q[tail]=next;        }    }    return -1;}int main(){    int cas=0;    while(scanf("%d%d%d",&n,&m,&l))    {        if(m+n+l==0)        {            break;        }        memset(tab,0,sizeof(tab));        memset(vis,0,sizeof(vis));        init();        cas++;        printf("Case %d: ",cas);        printf("%d\n",bfs());    }    return 0;}/*5 6 44 14 23 23 132 33 33 44 4 42 31 31 42 442 12 23 44 2*/


0 0