POJ 1573 & POJ 2632(两道有趣的Robot)实例

/*
** POJ 2632 Crashing Robots
** Created by Rayn @@ 2014/04/16
** 坑爹的模拟题,脑壳不清晰的就要被坑惨了
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX = 110;

struct pos{
    int id, dir; /* N-0,E-1,S-2,W-3 */
    int x, y;
};

pos rob[MAX];
int HaveRob[MAX][MAX];
int K, A, B, N, M;
int mov[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};

int DirToNum(char ch)
{
    switch(ch)
    {
        case 'N':
            return 0;
        case 'E':
            return 1;
        case 'S':
            return 2;
        case 'W':
            return 3;
        default:
            break;
    }
    return -1;
}
int CrashWall(int x, int y)
{
    if(x<=0 || x>A || y<=0 || y>B)
        return 1;
    return 0;
}
int main()
{
    char str[10], act[10];
    int num, rep;

    scanf("%d", &K);
    while(K--)
    {
        memset(HaveRob, 0, sizeof(HaveRob));
        scanf("%d%d%d%d", &A, &B, &N, &M);
        for(int i=1; i<=N; ++i)
        {
            scanf("%d %d %s", &rob[i].x, &rob[i].y, str);
            rob[i].dir = DirToNum(str[0]);
            rob[i].id = i;
            HaveRob[rob[i].x][rob[i].y] = i;
        }

        int first = 1, ok = 1, tx, ty;
        while(M--)
        {
            scanf("%d %s %d", &num, act, &rep);
            if(!first)
                continue;
            while(rep--)
            {
                if(act[0] == 'L')
                {
                    rob[num].dir = (rob[num].dir + 3) % 4;
                }
                if(act[0] == 'R')
                {
                    rob[num].dir = (rob[num].dir + 1) % 4;
                }
                if(act[0] == 'F')
                {
                    tx = rob[num].x + mov[rob[num].dir][0];
                    ty = rob[num].y + mov[rob[num].dir][1];
                    if(CrashWall(tx, ty) && first)
                    {
                        printf("Robot %d crashes into the wall\n", num);
                        first = ok = 0;
                    }
                    if(HaveRob[tx][ty] && first)
                    {
                        printf("Robot %d crashes into robot %d\n", num, HaveRob[tx][ty]);
                        first = ok = 0;
                    }
                    HaveRob[rob[num].x][rob[num].y] = 0;
                    rob[num].x = tx;
                    rob[num].y = ty;
                    HaveRob[rob[num].x][rob[num].y] = num;
                }
            }
        }
        if(ok)
            printf("OK\n");
    }
    return 0;
}
/*
** POJ 2688 Cleaning Robot
** Created by Rayn @@ 2014/05/07
** 好久没做搜索,又写错了dir方向数组
** 竖向是x坐标,横向是y坐标
*/
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int MAX = 15;

int dir[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};/* N,S,E,W */
int loop, step;
int maze[MAX][MAX], vis[MAX][MAX];

void Init()
{
    memset(vis, 0, sizeof(vis));
    for(int i=0; i<MAX; ++i)
    {
        for(int j=0; j<MAX; ++j)
        {
            maze[i][j] = 5; //在地图外圈置为5,方便判断出界
        }
    }
}
int Trans(char ch)
{
    int dir = 5;
    switch(ch)
    {
        case 'N':
            return 0;
        case 'S':
            return 1;
        case 'E':
            return 2;
        case 'W':
            return 3;
        default:
            break;
    }
    return dir;
}
void DFS(int x, int y, int s)
{
    if(maze[x][y] == 5)
    {
        step = s;
        loop = -1;
        return ;
    }
    if(vis[x][y] != 0)
    {
        step = vis[x][y] - 1;
        loop = s - step;
        return ;
    }
    vis[x][y] = s + 1;
    int tx = x + dir[maze[x][y]][0];
    int ty = y + dir[maze[x][y]][1];
    DFS(tx, ty, vis[x][y]);
}
int main()
{
#ifdef _Rayn
    freopen("in.txt", "r",stdin);
#endif

    int h, w, start;
    char tmp[15];

    while(scanf("%d%d%d", &h, &w, &start) != EOF)
    {
        if(h==0 && w==0 && start==0)
            break;
        Init();
        for(int i=1; i<=h; ++i)
        {
            scanf("%s", tmp);
            for(int j=0; j<w; ++j)
            {
                maze[i][j+1] = Trans(tmp[j]);
            }
        }
        loop = 0;
        DFS(1, start, 0);
        if(loop == -1)
            printf("%d step(s) to exit\n", step);
        else
            printf("%d step(s) before a loop of %d step(s)\n", step, loop);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值