CSU 1341: String and Arrays

题目:

Description

    有一个N*N的字符矩阵,从上到下依次记为第1行,第2行,……,第N行,从左至右依次记为第1列,第2列,……,第N列。
    对于这个矩阵会进行一系列操作,但这些操作只有两类:
    (1) R: 将矩阵逆时针旋转90度;
    (2) P x y: 将此时第x行第y列的字符打印出来,其中1 <= xy <= N

Input

    输入数据的第一行包含一个整数T (1 <= T <= 20),表示接下来一共有T组测试数据。
    对于每组测试数据,第一行包含一个整数N (1 <= N <= 300),含义同上。接下来一共有N行,每行均包含N个大写字母,描述了这个矩阵的初始情况。再接下来一行包含一个整数M (1 <= M <=10000)表示一共对矩阵进行了M次操作。接下来M行,每行均包含一个符合上述格式的操作,依次描述了这M个操作。

Output

    对于每个第(2)类操作,用一行打印出指定位置的字符。
    相邻的两组测试数据中间用一个空行隔开。

Sample Input

3
2
AB
CD
3
P 1 1
R
P 1 1
2
AB
CD
4
R
R
P 2 1
P 1 2
3
ABC
DEF
GHI
5
P 3 3
R
P 3 3
R
P 3 3

Sample Output

A
B

B
C

I
G
A

HINT

    这个题目主要练习如何读入字符串,以及对数组的使用。


    初始矩阵直接用读入字符串的方式读入就可以了,但是每个操作要如何读入呢?先用getchar(x)或者scanf(“%c”, &x)读入一个字符,然后再根据读入的字符判断是否要再读入两个整数? 


    其实getchar(x)或者scanf(“%c”, &x)有的时候很令人头疼(也许只有你亲自尝试过才能体会到), 因为他不仅可以读入一个字母,也可以读入空格、换行等等,因此如果我们不细加控制的话,scanf(“%c”, &x)很可能读到的未必是我们想要的那个字符。但scanf(“%s”, s)就不一样了,会忽略掉空格、换行等等,就像我们使用scanf(“%d”, &x)读整数那样。因此即使只有一个字母,我们也更推荐使用scanf(“%s”, s)的形式去读入,然后s[0]自然就是那个字符了。


    这个题目具体要怎么做呢?看似直接模拟两种操作就好了,打印字符最简单了,而旋转矩阵也不是很麻烦,不过可能要借助一个“中间矩阵”来完成旋转更好一些。但问题来了,如果每个R我们都进行旋转的话,实际上代价是很大的,对于这个题目而言会超时。也许你会机智地想到把相邻的R操作合并成一个,这样代价会小一点,是的,但是这样并不能解决根本问题,比如R和P是交替出现的。


    但其实我们可以做到只要旋转3次矩阵,你想到了吗?


    或者也许我们根本没必要按题意来去旋转矩阵?是否可以直接找到要打印的字符在初始矩阵中的位置呢?


    最后注意相邻两组测试数据之间要打印一个空行,就像在“A Sample Problem”中说的那样,OJ对于输出的格式要求是很严格的。



解析写的太好了,我就直接上代码好了。

代码:

#include <iostream>
using namespace std;

char c[301][301];
int t, n, m, sum, x, y;

char f()
{
	if (sum == 0)return c[x][y];
	if (sum == 1)return c[n + 1 - y][x];
	if (sum == 2)return c[n + 1 - x][n + 1 - y];
	return c[y][n + 1 - x];
}

int main()
{
	ios_base::sync_with_stdio(false);
	char ch;
	cin >> t;
	while (t--)
	{
		cin >> n;
		for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)cin >> c[i][j];
		cin >> m;
		sum = 0;
		while (m--)
		{
			cin >> ch;
			if (ch == 'R')sum--;	//不是加,是减
			else
			{
				sum = ((sum % 4) + 4) % 4;
				cin >> x >> y;
				cout << f() << endl;
			}
		}
		cout << endl;
	}
	return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nameofcsdn/article/details/79964870
个人分类: 模拟
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

CSU 1341: String and Arrays

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭