T292114 [传智杯 #5 练习赛] 清洁工

前言:
我不生产题解,我只是题解的搬运工,本篇文章一是自己动手整理加深印象,二是记录大佬的思路,借鉴学习
借鉴于https://blog.csdn.net/weixin_63484669/article/details/127940262

解题思路:
模拟过程,使用一个时间数组记录每个格子对应的时间,根据时间加上每次对应的灰尘数,最后输出注意一下,程序实现时用的数组下标,输出时对应的是坐标系下标,

可以假象一下,数组下标对应坐标系的第四象限,然后把这第四象限的数据,向上旋转90度到了第一象限,便是最终输出的形式,因此这个过程中需要考虑上下左右对应的不是真正的上下左右,应该是“右左上下”,自己体会2333

题目描述:
有一个 n×n 的地块,一个连续 i 分钟没人经过的地面在第 i 分钟会落上 i个单位的灰,有人经过时不会落灰但灰也不会清零,在人走后第一分钟又会落上一个单位的灰,以此类推。你在这个 n×n 的范围内移动,你的移动轨迹可以描述为一个由 {N,S,W,E} 组成的字符串,每个字母分别表示上、下、左、右。这个人一开始在点 (x,y),每一分钟移动一步。

求最后每一个位置上落下的灰的量。

本题中的上和右分别表示 y 轴正方向和 x 轴正方向。保证你没有超过移动的范围。

输入格式
第一行四个正整数 n,m,x,y 含义如题面所示,其中 x,y 表示横纵坐标,不是数组下标。
第二行一个长度为 m 的字符串,表示你的移动序列。

输出格式
共n 行,每行 n 个数,第 i 行的第 j个数表示坐标 (j,n-i+1) 上的灰的数量

上代码:

#include
#include

using namespace std;

const int N = 55, M = 1010;

int dk[N][N]; // n*n的地块 
int t[N][N];  // 用来记录每个格子对应的时间
char s[M]; // 记录上下左右的字符 

int tx[4] = {0, 0, -1, 1}, ty[4] = {1, -1, 0, 0};

int n, m, x, y;

// 注意一个问题,x y的位置是对应坐标轴中的位置,和数组下标不对应 
int main(){
	
	cin >> n >> m >> x >> y;
	
	for(int i = 0;i < m;i ++) cin >> s[i];
	
	// 开始模拟操作 
	for(int k = 0;k < m;k ++){  // 遍历字符 
		
		// 先初始化每一次的时间数组 
		for(int i = 1;i <= n;i ++){
			for(int j = 1;j <= n;j ++){
				if(i == x && j == y) t[i][j] = 0;
				else t[i][j] ++;
			}
		}
		
		// 对每个格子进行灰尘的累加
		for(int i = 1;i <= n;i ++){
			for(int j = 1;j <= n;j ++){
				dk[i][j] += t[i][j];
			}
		}
		
		// 走下一步  注意这里的上下左右不是数组的上下左右,是坐标系的上下左右!! 
		if(s[k] == 'N'){
			x += tx[0], y += ty[0];
		}else if(s[k] == 'S'){
			x += tx[1], y += ty[1];
		}else if(s[k] == 'W'){
			x += tx[2], y += ty[2];
		}else{
			x += tx[3], y += ty[3];
		}
		 
	}
	
	
	// 输出最终结果
	for(int i = n;i >= 1;i --){
		for(int j = 1;j <= n;j ++){
			cout << dk[j][i] << ' ';
		}
		cout << endl;
	} 
	return 0;
} 

你可能感兴趣的:(算法总结,算法,c++,数据结构)