Codeforces Round #492 (Div. 2) [Thanks, uDebug!]:C. Tesla(大模拟)

time limit per test  3 seconds
memory limit per test  256 megabytes
input  standard input
output  standard output

Allen dreams of one day owning a enormous fleet of electric cars, the car of the future! He knows that this will give him a big status boost. As Allen is planning out all of the different types of cars he will own and how he will arrange them, he realizes that he has a problem.

Allen's future parking lot can be represented as a rectangle with 44 rows and nn (n50n≤50) columns of rectangular spaces, each of which can contain at most one car at any time. He imagines having kk (k2nk≤2n) cars in the grid, and all the cars are initially in the second and third rows. Each of the cars also has a different designated parking space in the first or fourth row. Allen has to put the cars into corresponding parking places.

Illustration to the first example.

However, since Allen would never entrust his cars to anyone else, only one car can be moved at a time. He can drive a car from a space in any of the four cardinal directions to a neighboring empty space. Furthermore, Allen can only move one of his cars into a space on the first or fourth rows if it is the car's designated parking space.

Allen knows he will be a very busy man, and will only have time to move cars at most 2000020000 times before he realizes that moving cars is not worth his time. Help Allen determine if he should bother parking his cars or leave it to someone less important.

Input

The first line of the input contains two space-separated integers nn and kk (1n501≤n≤501k2n1≤k≤2n), representing the number of columns and the number of cars, respectively.

The next four lines will contain nn integers each between 00 and kk inclusive, representing the initial state of the parking lot. The rows are numbered 11 to 44 from top to bottom and the columns are numbered 11 to nn from left to right.

In the first and last line, an integer 1xk1≤x≤k represents a parking spot assigned to car xx (you can only move this car to this place), while the integer 00 represents a empty space (you can't move any car to this place).

In the second and third line, an integer 1xk1≤x≤k represents initial position of car xx, while the integer 00 represents an empty space (you can move any car to this place).

Each xx between 11 and kk appears exactly once in the second and third line, and exactly once in the first and fourth line.

Output

If there is a sequence of moves that brings all of the cars to their parking spaces, with at most 2000020000 car moves, then print mm, the number of moves, on the first line. On the following mm lines, print the moves (one move per line) in the format ii rr cc, which corresponds to Allen moving car ii to the neighboring space at row rr and column cc.

If it is not possible for Allen to move all the cars to the correct spaces with at most 2000020000 car moves, print a single line with the integer 1−1.

Examples
input
4 5
1 2 0 4
1 2 0 4
5 0 0 3
0 5 0 3
output
6
1 1 1
2 1 2
4 1 4
3 4 4
5 3 2
5 4 2
input
1 2
1
2
1
2
output
-1


题意:给你一个4*n的场景地图,其中第1,4行是停车位,第2,3行是车道,你有m辆车,一开始每辆车都一定在第2,3行的某个位置,并且每辆车在第1,4行都一定有一个独一无二的停车位(可以看题目中的图片),要求你要把每辆车都开到其对应的停车位上,规则如下:①每辆车每一步都可以往上下左右四个方向移动一格,当然那个位置必须为空;②这辆车必须在第2,3行才能移动,也就是这辆车只要进入第1,4行,必须是一步到达自己的车位!③必须在20000步内解决,有解先输出步数,然后每行3个数x, y, z表示编号为x的车移动到(y, z)位置上,答案不唯一,如果做不到输出-1


思路:

  1. 假设当前有且只有一个空位,你会发现这其实就是个类似于华容道的拼图游戏,直接模拟即可
  2. 假设当前有多个空位,选择其中任意一个空位就行,然后就是情况①
  3. 假设当前没有空位,尽可能腾出一个空位来,然后还是情况①,腾不出来输出-1


代码参考:

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct
{
	int id;
	int x, y, tx, ty;
}Res;
Res s[20005], p[205];
int len, cnt, x, y, road[5][55];
void Go(int ex, int ey)
{
	int dx, dy;
	if(x!=ex)
	{
		dx = ex, dy = y;
		s[++cnt].id = road[dx][dy];
		s[cnt].x = x, s[cnt].y = y;
		p[road[dx][dy]].x = x, p[road[dx][dy]].y = y;
		swap(road[x][y], road[dx][dy]);
		x = dx, y = dy;
	}
	while(ey<y)
	{
		//printf("%d %d\n", x, y);
		dx = x, dy = y-1;
		s[++cnt].id = road[dx][dy];
		s[cnt].x = x, s[cnt].y = y;
		p[road[dx][dy]].x = x, p[road[dx][dy]].y = y;
		swap(road[x][y], road[dx][dy]);
		x = dx, y = dy;
	}
	while(ey>y)
	{
		dx = x, dy = y+1;
		//printf("%d %d\n", x, y);
		s[++cnt].id = road[dx][dy];
		s[cnt].x = x, s[cnt].y = y;
		p[road[dx][dy]].x = x, p[road[dx][dy]].y = y;
		swap(road[x][y], road[dx][dy]);
		x = dx, y = dy;
	}
}
int main(void)
{
	int n, i, j, now, temp;
	scanf("%d%d", &len, &n);
	cnt = x = y = 0;
	for(i=1;i<=4;i++)
	{
		for(j=1;j<=len;j++)
		{
			scanf("%d", &road[i][j]);
			if(i==1 || i==4)
				p[road[i][j]].tx = i, p[road[i][j]].ty = j;
			else
				p[road[i][j]].x = i, p[road[i][j]].y = j;
			if(road[i][j]==0 && i!=1 && i!=4)
				x = i, y = j;
		}
	}
	if(x==0)
	{
		temp = 0;
		for(i=1;i<=len;i++)
		{
			if(road[1][i]==road[2][i])
			{
				s[++cnt].id = road[1][i], s[cnt].x = 1, s[cnt].y = i;
				road[2][i] = 0;
				temp = road[1][i];
				x = 2, y = i;
				break;
			}
			if(road[3][i]==road[4][i])
			{
				s[++cnt].id = road[3][i], s[cnt].x = 4, s[cnt].y = i;
				road[3][i] = 0;
				temp = road[4][i];
				x = 3, y = i;
				break;
			}
		}
		if(temp==0)
		{
			printf("-1\n");
			return 0;
		}
	}
	for(i=1;i<=n;i++)
	{
		if(i==temp)
			continue;
		if(p[i].x==3)
			Go(2, p[i].y);
		else
		{
			Go(3, p[i].y);
			Go(2, p[i].y);
		}
		while(p[i].ty>p[i].y)
		{
			now = p[i].y;
			Go(2, now+1);
			Go(3, now+1);
			Go(3, now);
			Go(2, now);
			Go(2, now+1);
		}
		while(p[i].ty<p[i].y)
		{
			now = p[i].y;
			Go(2, now-1);
			Go(3, now-1);
			Go(3, now);
			Go(2, now);
			Go(2, now-1);
		}
		if(p[i].tx==4)
		{
			s[++cnt].id = i, s[cnt].x = 4, s[cnt].y = p[i].y;
			road[3][p[i].y] = 0;
		}
		else
		{
			Go(3, p[i].y);
			s[++cnt].id = i, s[cnt].x = 1, s[cnt].y = p[i].y;
			road[2][p[i].y] = 0;
		}
	}
	now = 0;
	for(i=1;i<=cnt;i++)
	{
		if(s[i].id!=0)
			s[++now] = s[i];
	}
	printf("%d\n", now);
	for(i=1;i<=now;i++)
		printf("%d %d %d\n", s[i].id, s[i].x, s[i].y);
	return 0;
}
/*
3 2
1 2 0
2 0 0
1 0 0
0 0 0
*/

猜你喜欢

转载自blog.csdn.net/jaihk662/article/details/80803117