zoukankan      html  css  js  c++  java
  • 中南oj String and Arrays

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2072&pid=1

    Problem B: String and Arrays

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 222  Solved: 56
    [Submit][Status][Web Board]

    Description

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


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

    其实我们根本没必要按题意来去旋转矩阵,可以直接找到要打印的字符在初始矩阵中的位置!(不错的想法,有的时候没必要想的太过复杂)

    最后注意:每组测试数据之间有一个空行~避免pe

    详见代码。
     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 char ch;
     7 int n;
     8 char str[310][310];
     9 char fun(int x,int y,int l)
    10 {
    11     if (l==1)
    12         return str[y][n-x+1];
    13     else if (l==2)
    14         return str[n-x+1][n-y+1];
    15     else if (l==3)
    16         return str[n-y+1][x];
    17     else
    18         return str[x][y];
    19 }
    20 
    21 int main ()
    22 {
    23     int T,m,x,y;
    24     scanf("%d",&T);
    25     while (T--)
    26     {
    27         int ans=0;
    28         scanf("%d",&n);
    29         for (int i=1;i<=n;i++)
    30         {
    31             scanf("%s",str[i]+1);
    32         }
    33         scanf("%d",&m);
    34         while (m--)
    35         {
    36             getchar();
    37             //scanf("%c%d%d",&ch,&x,&y);
    38             scanf("%c",&ch);
    39             if (ch=='P')
    40             {
    41                 scanf("%d%d",&x,&y);
    42                 printf ("%c
    ",fun(x,y,ans%4));
    43             }
    44             else
    45                 ans++;
    46             //printf ("")
    47         }
    48         if (T)
    49         printf ("
    ");
    50     }
    51     return 0;
    52 }
     
  • 相关阅读:
    明确架构目标
    是什么浪费了我的时间
    精益求精,抑或得过且过[转]
    web界面应用的十种常见技术
    我对软件优化的一些想法
    最新31个非常棒的 Photoshop 网页设计教程
    sql2005提示工具程序
    转载:一篇深入了解.NET中栈和堆较好的文章
    推荐18个非常棒的Web和移动开发框架
    介绍一下这些工具FishAspnetLoader
  • 原文地址:https://www.cnblogs.com/qq-star/p/4379193.html
Copyright © 2011-2022 走看看