zoukankan      html  css  js  c++  java
  • 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对于输出的格式要求是很严格的。

        同样的,我会给出示例代码,如果你觉得编写代码的时候有些困难的话可以参考一下示例代码,但最后一定要按自己的思路一气呵成一份完整的代码并获得“Accept”哟~


    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream> 
    using namespace std;
    
    char c[301][301];
    int t, n, m, sum, x, y;
    
    char Work()
    {
    	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()
    {
    	char ch[10];
    	scanf("%d",&t);
    	while (t--)
    	{
    		scanf("%d",&n);
    		for (int i = 1; i <= n; i++)
    		for (int j = 1; j <= n; j++)cin >> c[i][j];
    		scanf("%d",&m);
    		sum = 0;
    		while (m--)
    		{
    			scanf("%s",ch);
    			if (ch[0]== 'R') sum--;	
    			else
    			{
    				sum = ((sum % 4) + 4) % 4;
    				scanf("%d%d",&x,&y);
    				printf("%c
    ",Work());
    			}
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    /**********************************************************************
    	Problem: 1341
    	User: song_hai_lei
    	Language: C++
    	Result: AC
    	Time:264 ms
    	Memory:2112 kb
    **********************************************************************/
    


  • 相关阅读:
    autocomplete自动完成搜索提示仿google提示效果
    实现子元素相对于父元素左右居中
    javascript 事件知识集锦
    让 IE9 以下的浏览器支持 Media Queries
    「2013124」Cadence ic5141 installation on CentOS 5.5 x86_64 (limited to personal use)
    「2013420」SciPy, Numerical Python, matplotlib, Enthought Canopy Express
    「2013324」ClipSync, Youdao Note, GNote
    「2013124」XDMCP Configuration for Remote Access to Linux Desktop
    「2013115」Pomodoro, Convert Multiple CD ISO to One DVD ISO HowTo.
    「2013123」CentOS 5.5 x86_64 Installation and Configuration (for Univ. Labs)
  • 原文地址:https://www.cnblogs.com/csushl/p/9386553.html
Copyright © 2011-2022 走看看