Gym - 101606G Gentlebots (构造)

版权声明:本文为蒟蒻原创文章,转载请注明出处哦~ https://blog.csdn.net/a54665sdgf/article/details/82711149

题目链接

题意:两个机器人在一个三维空间里走动,分别由各自的起点走向各自的终点,途中两个机器人不能走到同一点或者交换位置。两个机器人可以同时移动,求出一个合法的移动路线,不超过7000步。

解法:可以让第两个机器人总是以到各自终点的曼哈顿距离减小的方向移动,如果第二个机器人与第一个机器人发生了冲突,则让第二个机器人重新随机选取一个方向走动即可。

#define FRER() freopen("i.txt","r",stdin)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int dr[][6]={{1,-1,0,0,0,0},{0,0,1,-1,0,0},{0,0,0,0,1,-1}};
int s[2][3],t[2][3],prv[2][3];

bool isequal(int a[3],int b[3])
{
    for(int i=0; i<=2; ++i)
        if(a[i]!=b[i])return false;
    return true;
}

void go()
{
    memcpy(prv,s,sizeof prv);
    for(int i=0; i<=1; ++i)
    {
        if(s[i][0]<t[i][0])s[i][0]++;
        else if(s[i][0]>t[i][0])s[i][0]--;
        else if(s[i][1]<t[i][1])s[i][1]++;
        else if(s[i][1]>t[i][1])s[i][1]--;
        else if(s[i][2]<t[i][2])s[i][2]++;
        else if(s[i][2]>t[i][2])s[i][2]--;
    }
    while(isequal(s[0],s[1])||((isequal(s[0],prv[1]))&&(isequal(s[1],prv[0]))))
    {
        memcpy(s[1],prv[1],sizeof s[1]);
        int k=rand()%6;
        for(int i=0;i<=2;++i)s[1][i]+=dr[i][k];
    }
    printf("(%d %d %d) (%d %d %d)\n",s[0][0],s[0][1],s[0][2],s[1][0],s[1][1],s[1][2]);
}

int main()
{
    srand(time(NULL));
    for(int i=0; i<=1; ++i)
    {
        for(int j=0; j<=2; ++j)scanf("%d",&s[i][j]);
        for(int j=0; j<=2; ++j)scanf("%d",&t[i][j]);
    }
    printf("(%d %d %d) (%d %d %d)\n",s[0][0],s[0][1],s[0][2],s[1][0],s[1][1],s[1][2]);
    while(!isequal(s[0],t[0])||!isequal(s[1],t[1]))
    {
        go();
    }
    return 0;
}

(当时这道题写得非常顺利,一遍就直接编译通过并ac了,很难得)

猜你喜欢

转载自blog.csdn.net/a54665sdgf/article/details/82711149
今日推荐