1474. About Frogs

http://acm.timus.ru/problem.aspx?space=1&num=1474

找规律 然后模拟

规律: 假设隔一个跳为 jump,相邻跳为 mov (mov  分为从左向右 movl_r 和从右向左 movr_l)

jump 的优先级高于 mov

对于 mov 当空格在 左面 movl_r 优先级高  当空格在 右面 movr_l 优先级高  当空格在中间 优先级任意 但要始终不变。

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<vector>

#include<queue>

#include<map>

#include<stack>

#include<algorithm>

#include<cmath>



using namespace std;

//#pragma comment(linker,"/STACK:1000000000,1000000000")



#define LL long long



const int INF=0x3f3f3f3f;

const int N=1005;

const int M=1000000;

int frogs[N];

int space;

int ans[M+5],num;

int n;

bool jump()

{

    if(space-2>=0&&frogs[space-2]==-1&&frogs[space-1]==1)

    {swap(frogs[space-2],frogs[space]);ans[num++]=space=space-2;return true;}

    if(space+2<=2*n&&frogs[space+2]==1&&frogs[space+1]==-1)

    {swap(frogs[space+2],frogs[space]);ans[num++]=space=space+2;return true;}

    return false;

}

bool movr_l()

{

    if(space+1<=2*n&&frogs[space+1]==1)

    {swap(frogs[space+1],frogs[space]);ans[num++]=space=space+1;return true;}

    return false;

}

bool movl_r()

{

    if(space-1>=0&&frogs[space-1]==-1)

    {swap(frogs[space-1],frogs[space]);ans[num++]=space=space-1;return true;}

    return false;

}

bool mov()

{

    if(space>=n)

    {

        if(movr_l())

        return true;

        if(movl_r())

        return true;

    }else

    {

        if(movl_r())

        return true;

        if(movr_l())

        return true;

    }

    return false;

}

bool action()

{

    if(jump())

    return true;

    if(mov())

    return true;

    return false;

}

int main()

{

    //freopen("data.txt","r",stdin);

    while(cin>>n)

    {

        for(int i=0;i<n;++i)

        {frogs[i]=-1;frogs[i+n+1]=1;}

        frogs[n]=0;

        space=n;

        num=0;

        while(num<M&&action())

        ;

        if(space!=n)

        {cout<<"-1"<<endl;continue;}

        int l;

        for(l=0;l<n;++l)

        if(frogs[l]!=1)

        break;

        if(l<n)

        cout<<"-1"<<endl;

        else

        {

            cout<<num<<endl;

            cout<<ans[0];

            for(int i=1;i<num;++i)

            cout<<" "<<ans[i];

            cout<<endl;

        }

    }

    return 0;

}

 

你可能感兴趣的:(out)