URAL 1386 Maze 解题报告

比赛总结

题目

题意:

一个N×M的网格图,可以做四种操作,已知对于每个格子四种操作后会到达哪个格子。现在告诉你完整的操作序列,但是起始位置不知,求可能最后到达哪些位置。

题解:

直接模拟。


//Time:343ms
//Memory:857KB
//Length:1157B
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define MAXN 110
#define FI first
#define SE second
pair<int,int> to[MAXN][MAXN][4];
vector<pair<int,int> >vec;
int ins[4010];
int s;
void cal(int x,int y)
{
    pair<int,int> tmp;
    for(int i=0;i<s;++i)
    {
        tmp=to[x][y][ins[i]-1];
        x=tmp.FI,y=tmp.SE;
    }
    vec.push_back(tmp);
}
int main()
{
    //freopen("/home/moor/Code/input.txt","r",stdin);
    int n,m,cnt=0;
    scanf("%d%d",&n,&m);

    for(int k=0;k<4;++k)
    {
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                scanf("%d%d",&to[i][j][k].FI,&to[i][j][k].SE);
    }
    vec.clear();
    scanf("%d",&s);
    for(int i=0;i<s;++i)    scanf("%d",&ins[i]);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            cal(i,j);
    sort(vec.begin(),vec.end());
    for(int i=0;i<vec.size();++i)
        if(i==0||vec[i]!=vec[i-1])
            ++cnt;
    printf("%d\n",cnt);
    for(int i=0;i<vec.size();++i)
        if(i==0||vec[i]!=vec[i-1])
            printf("%d %d\n",vec[i].FI,vec[i].SE);
    return 0;
}


你可能感兴趣的:(URAL 1386 Maze 解题报告)