zoukankan      html  css  js  c++  java
  • poj2632

    本题的图与其他题稍有不同,本题以左下角为(0,0)点,列号对应x,行号对应y。

    完全模拟即可。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    const int maxa = 101;
    
    struct Robot
    {
    	int x, y, d;
    } robot[maxa];
    
    int dir[4][2] =
    {
    { 0, 1 },//e
    { -1, 0 }, //s
    { 0, -1 }, //w
    { 1, 0 } }; //n
    
    
    int n, m, cx, cy;
    int map[maxa][maxa];
    
    void init()
    {
    	memset(map, 0, sizeof(map));
    	cin >> cy >> cx >> n >> m;
    	for (int i = 1; i <= n; i++)
    	{
    		cin >> robot[i].y >> robot[i].x;
    		getchar();
    		switch (getchar())
    		{
    		case 'E':
    			robot[i].d = 0;
    			break;
    		case 'S':
    			robot[i].d = 1;
    			break;
    		case 'W':
    			robot[i].d = 2;
    			break;
    		case 'N':
    			robot[i].d = 3;
    			break;
    		}
    		map[robot[i].x][robot[i].y] = i;
    	}
    }
    
    bool forward(int a)
    {
    	map[robot[a].x][robot[a].y] = 0;
    	robot[a].x += dir[robot[a].d][0];
    	robot[a].y += dir[robot[a].d][1];
    	int x = robot[a].x;
    	int y = robot[a].y;
    	if (x == 0 || x > cx || y == 0 || y > cy)
    	{
    		printf("Robot %d crashes into the wall\n", a);
    		return false;
    	}
    	if (map[x][y] != 0)
    	{
    		printf("Robot %d crashes into robot %d\n", a, map[x][y]);
    		return false;
    	}
    	map[x][y] = a;
    	return true;
    }
    
    bool operate(int a, char op, int times)
    {
    	if (op == 'F')
    	{
    		for (int i = 0; i < times; i++)
    			if (!forward(a))
    				return false;
    		return true;
    	}
    	if (op == 'L')
    		robot[a].d -= times;
    	else
    		robot[a].d += times;
    	robot[a].d %= 4;
    	if (robot[a].d < 0)
    		robot[a].d += 4;
    	return true;
    }
    
    void finish(int times)
    {
    	string st;
    	while (times--)
    		getline(cin, st);
    }
    
    void work()
    {
    	for (int i = 0; i < m; i++)
    	{
    		int num, time;
    		char op;
    		cin >> num;
    		getchar();
    		cin >> op >> time;
    		getchar();
    		if (!operate(num, op, time))
    		{
    			finish(m - i - 1);
    			return;
    		}
    	}
    	cout << "OK\n";
    }
    
    int main()
    {
    	//freopen("D:\\t.txt", "r", stdin);
    	int t;
    	cin >> t;
    	while (t--)
    	{
    		init();
    		work();
    	}
    	return 0;
    }
  • 相关阅读:
    WCF添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。
    【C#】 实现WinForm中只能启动一个实例
    centos7防火墙问题
    ftp搭建记录
    centos7常用命令
    RocketMQ部署
    mongedb主从
    redis 主从复制+读写分离+哨兵
    keepalive+nginx
    分布架构分析
  • 原文地址:https://www.cnblogs.com/rainydays/p/1948677.html
Copyright © 2011-2022 走看看