列表

详情


NC207619. 推箱子

描述

给你一个 10 行 10 列的地图,地图上有一定数量的箱子和一个人,现在让你完成一些操作,输出最后的地图状态。

操作有四种,描述如下:

move x: x是非负整数,表示你向正上方前进 x 步,如果即将走出地图,则停止。如果面前有箱子,则将其向前推,可同时推多个箱子。

turn left: 地图向左旋转90度

turn right: 地图向右旋转90度

turn back: 地图向右旋转180度

输入描述

第一行包含一个整数 T ( 1 ≤ T ≤ 10 ) 表示共有T组测试样例;

输入前 10 行,每行10个字符,给出棋盘状态。“.”表示该格为空,“@”表示人,字母表示的箱子。

接下来每组的第一行有一个整数 k ( 1 ≤ k ≤ 1000 ) k 为操作数
接下来 k 行,每行一个操作( 1 ≤ x ≤ 10 )

输出描述


输出 10 * 10 的地图状态

示例1

输入:

1
..........
..........
..........
..........
..........
..........
.....@....
.........a
.........b
.........c
4
turn left
move 8
turn left
move 1

输出:

b.........
a.........
@.........
..........
..........
..........
..........
..........
..........
..........

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 492K, 提交时间: 2020-06-07 16:23:52

#include<bits/stdc++.h>
using namespace std;
#define INF 1000000000

char maps[15][15];
int dx[4]={-1,0,1,0}, dy[4]={0,-1,0,1};

void push(int dir,int x,int y){
	if(x<0||x>=10||y<0||y>=10) return;
	int ax = x-dx[dir], ay = y-dy[dir];
	if(maps[x][y]!='.'){
		push(dir,x+dx[dir],y+dy[dir]);
	}
	maps[x][y]=maps[ax][ay];
}

int main(){
	int T, n;
	scanf("%d",&T);
	while(T--){
		int nx, ny;
		for(int i = 0;i < 10;i++){
			scanf("%s",maps[i]);
		}
		for(int i = 0;i < 10;i++)
			for(int j = 0;j < 10;j++)
				if(maps[i][j]=='@'){
					nx = i, ny = j;
				}
		int k;
		scanf("%d",&k);
		getchar();
		int dir=0;
		while(k--){
			char str[15];
			scanf("%s",str);
			if(str[0]=='t'){
				scanf("%s",str);
				if(str[0]=='l')
					dir=(dir+3)%4;
				else if(str[0]=='r')
					dir=(dir+1)%4;
				else dir = (dir+2)%4;
			}
			else{
				int x;
				scanf("%d",&x);
				for(int i = 0;i < x;i++){
					int ax = nx+dx[dir], ay = ny+dy[dir];
					if(ax>=0&&ax<10&&ay>=0&&ay<10){
						push(dir,ax,ay);
						maps[nx][ny]='.';
						nx=ax;ny=ay;
					}
					
				}
			}
			
		}
		if(dir==0){
			for(int i = 0;i <10;i++)
				printf("%s\n",maps[i]);
		}
		else if(dir==1){
			for(int j = 0;j<10;j++){
				for(int i = 9;i >= 0;i--)
					printf("%c",maps[i][j]);
				printf("\n");
			}
		}
		else if(dir==2){
			for(int i = 9;i>=0;i--){
				for(int j = 9;j >= 0;j--)
					printf("%c",maps[i][j]);
				printf("\n");
			}
		}
		else{
			for(int j = 9;j>=0;j--){
				for(int i = 0;i < 10;i++)
					printf("%c",maps[i][j]);
				printf("\n");
			}
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 9ms, 内存消耗: 504K, 提交时间: 2020-06-07 15:14:50

#include <iostream>
#include <algorithm>
using namespace std;
char mp[20][20];
int t,q,a,dr;
char cmd[20];
struct dir{
	int x,y;
	dir operator +(dir dx){
		return (dir){x+dx.x,y+dx.y};
	}
	bool safe(){
		if(x<0||y<0||x>=10||y>=10)return false;
		return true;
	}
}dft[4]={-1,0,0,1,1,0,0,-1},vct,quana;
dir fnd(){
	for(int i=0;i<10;i++)for(int j=0;j<10;j++)if(mp[i][j]=='@')
	return (dir){i,j};
}
void mov(char c,dir pos){
	if(!pos.safe())return;
	if(mp[pos.x][pos.y]!='.')mov(mp[pos.x][pos.y],pos+dft[dr]);
	mp[pos.x][pos.y]=c;
}
void gogogo(){
	dir stp=quana+dft[dr];
	if(!stp.safe())return;
	mov('@',stp);
	mp[quana.x][quana.y]='.';
	quana=stp;
}

int main(){
	cin>>t;
	while(t--){
		dr=0;
		for(int i=0;i<10;i++)cin>>mp[i];
		quana=fnd();
		vct=dft[0];
		cin>>q;
		while(q--){
			cin>>cmd;
			if(cmd[0]=='t'){
				cin>>cmd;
				if(cmd[0]=='l')dr+=1;
				else if(cmd[0]=='r')dr+=3;
				else dr+=2;
				dr%=4;
			}
			else{
				cin>>a;
				while(a--)gogogo();
			}
		}
		switch(dr){
			case 0:
				for(int i=0;i<10;i++){
					for(int j=0;j<10;j++)printf("%c",mp[i][j]);	
					printf("\n");
				}
			break;
			case 1:
				for(int j=9;j>=0;j--){
					for(int i=0;i<10;i++)printf("%c",mp[i][j]);	
					printf("\n");
				}
			break;
			case 2:
				for(int i=9;i>=0;i--){
					for(int j=9;j>=0;j--)printf("%c",mp[i][j]);	
					printf("\n");
				}
			break;
			case 3:
				for(int j=0;j<10;j++){
					for(int i=9;i>=0;i--)printf("%c",mp[i][j]);	
					printf("\n");
				}
			break;
		}
	}
	
}

上一题