Codeforces 996C. Tesla

题意:有四行n列的车场,k辆车,一开始这些车都在第二行和第三行,第一行和第四行是停车的地方,标号代表对应的车只能停到该停车位,第一行和第四行0代表不能停车,第二行和第三行0代表有空位,问是否能通过不超过20000次的移动使得所有车进入停车位。(停车位是满足的)

分析:借鉴大神的思路,只要一开始第二行和第三行有空位或者能够有车进入停车位,则会满足第二行和第三行有空位,则以空位为头,按照一个方向旋转,就能保证每个车到达对应的车位,移动次数不超过100×100+100,满足条件。按照题意模拟即可。这里将第一行和第四行合并成一组,第二行和第三行合并成一组,注意顺序即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[110][110];
int n,k,s;
struct node{
    int id,x,y;
    node(int id,int x,int y):id(id),x(x),y(y){};
};
vector<node>ans;
void stop()//停车
{
    for(int i = 0; i < 2 * n; i++)//有车且对应标号相同
    {
        if(a[1][i] && (a[1][i] == a[0][i]))
        {
            ans.push_back((node){a[1][i], i / n == 1? 4:1, i % n + 1});
            a[1][i] = 0;//车道该位置为空
            k--;//入停车位
        }

    }
}
bool judge()//开始判断通道是否有空位或者停车之后是否有空位
{
    stop();
    for(int i = 0; i < 2 * n; i++)
    {
        if(!a[1][i])return true;
    }
    return false;
}
void turn()
{
    vector<node>v1,v2;//v从后往前,v2存放车头及其之后的车辆,v1存放车头之前的车辆,车头是空位,先动,v1接在v2的后面
    int t = a[1][2 * n - 1];
    for(int i = 2 * n - 1; i >= 1; i--)
    {
        a[1][i] = a[1][i - 1];
        if(a[1][i])
        {
            if(i > s)
            v1.push_back((node){a[1][i], i / n == 1 ? 3:2,i % n + 1});
            else
            v2.push_back((node){a[1][i],i / n == 1 ? 3:2, i % n + 1});
        }
    }
    a[1][0] = t;
    if(t)v2.push_back((node){t,2,1});
    vector<node>::iterator it;
    for(it = v2.begin(); it != v2.end(); it++)
    {
        ans.push_back(*it);
    }
    for(it = v1.begin(); it != v1.end(); it++)
    {
        ans.push_back(*it);
    }

}
int main()
{
    cin>>n>>k;
    for(int i = 0; i < n; i++)cin>>a[0][i];
    for(int i = 0; i < n; i++)cin>>a[1][i];
    for(int i = 2 * n - 1; i >= n; i--)cin>>a[1][i];//注意正着输入倒着存放
    for(int i = 2 * n - 1; i >= n; i--)cin>>a[0][i];
    if(!judge()){printf("-1\n");return 0;}
    for(int i = 0; i < 2 * n; i++)
    {
        if(!a[1][i])
        {
            s = i;
            break;
        }
    }
    while(k)
    {
        stop();
        turn();
        s = (s + 1) % (2 * n);
    }
    cout<<ans.size()<<endl;
    vector<node>::iterator it;
    for(it = ans.begin(); it != ans.end(); it++)
    {
        int x = (*it).x;
        int y = (*it).y;
        int id = (*it).id;
        if( x == 3 || x == 4)//因为是倒着存放后两行,还得变成正着放的
        {
            y = n - y + 1;
        }
        printf("%d %d %d\n",id,x,y);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhlbjtu2016/article/details/81152802