遭遇战_模拟

lzusa 发布于 2019-05-22 0 次阅读


题目大意

在一个n*n的矩形内,给出两个人的开始位置和开始方向,规定每一个人不可以走过自己走过的路径,每走一步的时间为1,且自己遇到障碍时右转,而对手向左转,转弯不用消耗时间,求在什么位置,两人可以相遇


思路

看数据的范围感觉bfs刚好不会炸,然后想想这题和广搜好像并没有什么很大的关系,所以就直接模拟解决就可以了
每一个时间每一个人个向前走一步,判断一下就可以了
特别要注意开始就在一起的情况


#include <stdio.h>
#include <string>
#include <cstring>
using namespace std;
#define maxn 1001
#define fill(x,y) memset(x,y,sizeof(x))
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
inline int read()
{
    int x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); }
    return x;
}
int f[maxn][maxn],f1[maxn][maxn];
int main()
{
    freopen("fight.in","r",stdin);
    freopen("fight.out","w",stdout);
    int t=read();
    for (int o=1;o<=t;o++)
    {
        fill(f,0);fill(f1,0);
        int n=read();
        int x=read(),y=read(),z=read();
        x++; y++;
        int x1=read(),y1=read(),z1=read();
        x1++; y1++;
        if (x==x1&&y==y1)
        {
            printf("%d %d",x-1,y-1);
            continue;
        }
        int tx=dx[z],ty=dy[z];
        int tx1=dx[z1],ty1=dy[z1];
        f[x][y]=1; f1[x1][y1]=1;
        int fl=2,ans=0,fll=0,flll=0,xx=0;
        while (fl>0)
        {
            ans++;
            if (x+tx>0&&x+tx<=n&&y+ty>=1&&y+ty<=n&&f[x+tx][y+ty]==0&&fll==0)
            {
                f[x+tx][y+ty]=1;
                x+=tx; y+=ty;
            }
            else if (fll==0)
            {
                if (z<3)
                    z++;
                else z=0;
                tx=dx[z]; ty=dy[z];
                if (x+tx==0||x+tx==n+1||y+ty==0||y+ty==n+1||f[x+tx][y+ty]==1)
                {
                    fl--;
                    fll=1;
                }
                else 
                {
                    f[x+tx][y+ty]=1;
                    x+=tx; y+=ty;
                }
            }
            if (x1+tx1>0&&x1+tx1<=n&&y1+ty1>=1&&y1+ty1<=n&&f1[x1+tx1][y1+ty1]==0&&flll==0)
            {
                f1[x1+tx1][y1+ty1]=1;
                x1+=tx1; y1+=ty1;
            }
            else if (flll==0)
            {
                if (z1>0)
                    z1--;
                else z1=3;
                tx1=dx[z1]; ty1=dy[z1];
                if (x1+tx1==0||x1+tx1==n+1||y1+ty1==0||y1+ty1==n+1||f1[x1+tx1][y1+ty1]==1)
                {
                    fl--;
                    flll=1;
                }
                else 
                {
                    f1[x1+tx1][y1+ty1]=1;
                    x1+=tx1; y1+=ty1;
                }
            }
            if (x==x1&&y==y1)
            {
                printf("%d %d\n",x-1,y-1);
                xx=1;
                break;
            }
        }
        if (xx==0) printf("-1\n");
    }
}