light 1055 //save for one years later

 

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>


using namespace std;
const int N=11,INF=0x7fffffff;
int vis[N][N][N][N][N][N];
char mat[N][N];
int n;
struct status
{
    int ax,ay,bx,by,cx,cy,t;
};
int move[4][2]= {{0,1},{0,-1},{1,0},{-1,0} };


inline bool illegal(int i)
{
    if(i<0||i>=n)
        return true;
    return false;
}


inline bool invalid(int x,int y)
{
    if(mat[x][y]=='#')
        return true;
    return false;
}


int bfs()
{
    int ax,ay,bx,by,cx,cy,t;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            if(mat[i][j]=='A')
                ax=i,ay=j;
            else if(mat[i][j]=='B')
                bx=i,by=j;
            else if(mat[i][j]=='C')
                cx=i,cy=j;


    status cur= {ax,ay,bx,by,cx,cy,0};
    queue<status>que;
    while(!que.empty())que.pop();
    memset(vis,0,sizeof(vis));
    que.push(cur);
    vis[ax][ay][bx][by][cx][cy]=0;


    while(!que.empty())
    {
        cur=que.front();
        que.pop();
        for(int i=0; i<4; i++)
        {
            ax=cur.ax+move[i][0],ay=cur.ay+move[i][1];
            bx=cur.bx+move[i][0],by=cur.by+move[i][1];
            cx=cur.cx+move[i][0],cy=cur.cy+move[i][1];
            t=cur.t+1;
            if(illegal(ax)||illegal(ay)||illegal(bx)||illegal(by)||illegal(cx)||illegal(cy))
                continue;
            if(vis[ax][ay][bx][by][cx][cy]!=0&&vis[ax][ay][bx][by][cx][cy]<t)
            continue;
            vis[ax][ay][bx][by][cx][cy]=t;
             if(mat[ax][ay]=='X'&&mat[bx][by]=='X'&&mat[cx][cy]=='X')
            {
                return t;
            }
            int fa,fb,fc;//0 means move  , while 1 means stay
            fa=fb=fc=0;
            if(invalid(ax,ay))fa++,ax-=move[i][0],by-=move[i][1];
            if(invalid(bx,by))fb++,bx-=move[i][0],by-=move[i][1];
            if(invalid(cx,cy))fc++,cx-=move[i][0],by-=move[i][1];
            if(fa&&fb&&fc)
                continue;
            if(vis[ax][ay][bx][by][cx][cy]!=0&&vis[ax][ay][bx][by][cx][cy]<t)
            continue;
            vis[ax][ay][bx][by][cx][cy]=t;
            if(ax==bx&&ay==by)
            {
                if(fa)
                bx-=move[i][0],by-=move[i][1],fb=1;
                else if(fb)
                ax-=move[i][0],ay-=move[i][1],fa=1;
            }
            if(ax==cx&&ay==cy)
            {
                if(fa)
                cx-=move[i][0],cy-=move[i][1],fc=1;
                else if(fc)
                ax-=move[i][0],ay-=move[i][1],fa=1;
            }
            if(bx==cx&&by==cy)
            {
                if(fb)
                cx-=move[i][0],cy-=move[i][1],fc=1;
                else if(fc)
                bx-=move[i][0],by-=move[i][1],fb=1;
            }
            if(fa&&fb&&fc)
            continue;
            vis[ax][ay][bx][by][cx][cy]=t;
            status next= {ax,ay,bx,by,cx,cy,t};
            que.push(next);
        }
    }


    return -1;
}


int main()
{
    freopen("in","r",stdin);
    int T,cas=0,ret;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
            scanf("%s",mat[i]);
        ret=bfs();
        printf("Case %d: ",++cas);
        printf(ret>=0?"%d\n":"trapped\n",ret);
    }
    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值