Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

搞了整整一晚上,代码有些烂

Posted by wyylling at 2009-10-31 00:21:34 on Problem 2632
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<numeric>
#include<cmath>
#include<bitset>
#include<set>
#include<queue>
#include<iterator>
#include<limits>
#include<map>
#include<cstring>

using namespace std;

#define EAST 0
#define WEST 1
#define NORTH 2
#define SOUTH 3;

typedef struct robot
{
	int x;
	int y;
	char direction;
};

int main(int argc, char* argv[])
{
	int K,A,B,N,M,i,j,k;
	int t1,t2,num,step,tmp,r1,r2;
	char ch;
	bool rr,rw,ok,flag;
	int arr[110][110];
	map<int,robot> m;
	map<int,robot>::iterator it,tranverse;
	scanf("%d",&K);
	while(K > 0)
	{
		rr = rw = ok = false;
		flag = false;
		scanf("%d %d",&A,&B);
		scanf("%d %d",&N,&M);
		num = 0;
		memset(arr,0,sizeof(arr));
		for(i = 0; i < N; ++i)
		{
			scanf("%d %d %c",&t1,&t2,&ch);
			robot r;
			r.x = B - t2 + 1;
			r.y = t1;//坐标原点由左下角换成左上角,也就是反转纵坐标
			r.direction = ch;
			++num;
			m.insert(make_pair(num,r));
			arr[B - t2 + 1][t1] = 1;//坐标原点由左下角换成左上角,也就是反转纵坐标
		}
		for(i = 0; i < M; ++i)
		{
			scanf("%d %c %d",&num,&ch,&step);
			it = m.find(num);
			if(ch == 'F' && flag == false)
			{
				if(it->second.direction == 'E')
				{
					//要移动的下一步有机器人存在
					tmp = it->second.y + step;
					for(k = it->second.x,j = it->second.y + 1; j <= tmp; ++j)
					{
						if(j > A)
							break;
						if(arr[k][j] == 1 && flag == false)
						{
							rr = true;
							r1 = num;
							for(tranverse = m.begin(); tranverse != m.end(); ++tranverse)
							{
								if( (tranverse->second.x == k) && (tranverse->second.y == j))
									r2 = tranverse->first;
							}
							flag = true;
							break;
						}
					}
					if(flag == true) continue;
					//越界
					if( (it->second.y + step) > A && flag == false)
					{
						rw = true;
						flag = true;
						r1 = num;
						continue;
					}

					if(rr == false)
					{
						arr[it->second.x][it->second.y] = 0;
						arr[it->second.x][it->second.y + step] = 1;
						it->second.y += step;
					}
					continue;
				}
				if(it->second.direction == 'W' && flag == false)
				{
					//要移动的下一步有机器人存在
					tmp = it->second.y - step;
					for(k = it->second.x,j = it->second.y - 1; j >= tmp; --j)
					{
						if(j < 1)
							break;
						if(arr[k][j] == 1 && flag == false)
						{
							rr = true;
							r1 = num;
							for(tranverse = m.begin(); tranverse != m.end(); ++tranverse)
							{
								if( (tranverse->second.x == k) && (tranverse->second.y == j))
									r2 = tranverse->first;
							}
							flag = true;
							break;
						}
					}
					if(flag == true) continue;
					//越界
					if( (it->second.y - step) < 1 )
					{
						rw = true;
						flag = true;
						r1 = num;
						continue;
					}

					if(rr == false)
					{
						arr[it->second.x][it->second.y] = 0;
						arr[it->second.x][it->second.y - step] = 1;
						it->second.y -= step;
					}
					continue;
				}
				if(it->second.direction == 'S' && flag == false)
				{
					//要移动的下一步有机器人存在
					tmp = it->second.x + step;
					for(k = it->second.x + 1,j = it->second.y; k <= tmp; ++k)
					{
						if(k > B)
							break;
						if(arr[k][j] == 1 && flag == false)
						{
							rr = true;
							r1 = num;
							for(tranverse = m.begin(); tranverse != m.end(); ++tranverse)
							{
								if( (tranverse->second.x == k) && (tranverse->second.y == j))
									r2 = tranverse->first;
							}
							flag = true;
							break;
						}
					}
					if(flag == true) continue;
					//越界
					if( (it->second.x + step) > B )
					{
						rw = true;
						r1 = num;
						flag = true;
						continue;
					}

					if(rr == false)
					{
						arr[it->second.x][it->second.y] = 0;
						arr[it->second.x  + step][it->second.y] = 1;
						it->second.x += step;
					}
					continue;
				}
				if(it->second.direction == 'N' && flag == false)
				{
					//要移动的下一步有机器人存在
					tmp = it->second.x - step;
					for(k = it->second.x - 1,j = it->second.y; k >= tmp; --k)
					{
						if(k < 1)
							break;
						if(arr[k][j] == 1 && flag == false)
						{
							rr = true;
							r1 = num;
							for(tranverse = m.begin(); tranverse != m.end(); ++tranverse)
							{
								if( (tranverse->second.x == k) && (tranverse->second.y == j))
									r2 = tranverse->first;
							}
							flag = true;
							break;
						}
					}
					if(flag == true) continue;

					//越界
					if( (it->second.x - step) < 1 )
					{
						rw = true;
						r1 = num;
						flag = true;
						continue;
					}

					if(rr == false)
					{
						arr[it->second.x][it->second.y] = 0;
						arr[it->second.x - step][it->second.y] = 1;
						it->second.x -= step;
					}
					continue;
				}
			}
			if(ch == 'R')
			{
				tmp = step % 4;
				if(it->second.direction == 'E')
				{
					if(tmp == 1)
						it->second.direction = 'S';
					if(tmp == 2)
						it->second.direction = 'W';
					if(tmp == 3)
						it->second.direction = 'N';
					continue;
				}
				if(it->second.direction == 'S')
				{
					if(tmp == 1)
						it->second.direction = 'W';
					if(tmp == 2)
						it->second.direction = 'N';
					if(tmp == 3)
						it->second.direction = 'E';
					continue;
				}
				if(it->second.direction == 'W')
				{
					if(tmp == 1)
						it->second.direction = 'N';
					if(tmp == 2)
						it->second.direction = 'E';
					if(tmp == 3)
						it->second.direction = 'S';
					continue;
				}
				if(it->second.direction == 'N')
				{
					if(tmp == 1)
						it->second.direction = 'E';
					if(tmp == 2)
						it->second.direction = 'S';
					if(tmp == 3)
						it->second.direction = 'W';
					continue;
				}

			}
			if(ch == 'L')
			{
				tmp = step % 4;
				if(it->second.direction == 'E')
				{
					if(tmp == 1)
						it->second.direction = 'N';
					if(tmp == 2)
						it->second.direction = 'W';
					if(tmp == 3)
						it->second.direction = 'S';
					continue;
				}
				if(it->second.direction == 'S')
				{
					if(tmp == 1)
						it->second.direction = 'E';
					if(tmp == 2)
						it->second.direction = 'N';
					if(tmp == 3)
						it->second.direction = 'W';
					continue;
				}
				if(it->second.direction == 'W')
				{
					if(tmp == 1)
						it->second.direction = 'S';
					if(tmp == 2)
						it->second.direction = 'E';
					if(tmp == 3)
						it->second.direction = 'N';
					continue;
				}
				if(it->second.direction == 'N')
				{
					if(tmp == 1)
						it->second.direction = 'W';
					if(tmp == 2)
						it->second.direction = 'S';
					if(tmp == 3)
						it->second.direction = 'E';
					continue;
				}

			}//end if
		}//end for
		if(rw == true)
			printf("Robot %d crashes into the wall\n",r1);
		else if(rr == true)
			printf("Robot %d crashes into robot %d\n",r1,r2);
		else
			printf("OK\n");
		m.clear();
		memset(arr,0,sizeof(arr));
		--K;
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator