zoukankan      html  css  js  c++  java
  • csu oj 1341 string and arrays

    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

    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 <iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    using namespace std;
    const int maxn=300+5;
    char a[maxn][maxn];
    char solve(int n,int x,int y,int cnt)
    {
        if(cnt==0) return a[x][y];
        if(cnt==1) return a[y][n+1-x];
        if(cnt==2) return a[n+1-x][n+1-y];
        if(cnt==3) return a[n+1-y][x];
    }
    int main()
    {
        int t,n,m,i;
        char c[3];
        scanf("%d",&t);
    while(t--)
        {
            scanf("%d",&n);
            for(i=1;i<=n;i++)
            scanf("%s",a[i]+1);//注意这里,指针加一
            scanf("%d",&m);
            int cnt=0;
            int x,y;
            while(m--)
            {
                scanf("%s",c);
                if(c[0]=='R') cnt++;
                else
                {
                    scanf("%d%d",&x,&y);
                    printf("%c
    ",solve(n,x,y,cnt%4));
                }
            }
            if(t) printf("
    ");
        }
        return 0;
    }

    上面这是c语言代码,c语言的输入输出

    下面给出C++代码

    个人认为C++的输入输出更加简洁

    #include <iostream>
    using namespace std;
    char c[301][301];
    int t, n, m, sum, x, y;
    char f(int n,int x,int y,int sum)
    {
     if (sum == 0)return c[x][y];
     if (sum == 1)return c[y][n+1-x];
     if (sum == 2)return c[n + 1 - x][n + 1 - y];
     if (sum == 3)return c[n+1-y][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
       {
        cin >> x >> y;
        cout << f(n,x,y,sum%4) << endl;
       }
      }
      cout << endl;
     }
     return 0;
    }

    */

    //--------------------
    /.................................................................................................................................................................................................................................
    /
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    int main()
    {
     char s[6];
    // for(int i=0;i<6;i++){
    //  scanf("%c",&s[i]);
    // }
    // scanf("%s",s);
    cin>>s;
        printf("%s",s); 
     cout<<s;
     return 0;
    }
     

    //cin和scanf("%s")很像,只能读入非空格符和非换行符,如果第一个输入的字符就是空格,则忽略;如果第一个不是空格,则读到有空格或者换行符为止
    //scanf("%c")则可以读取输入空格符和换行符。当读入的字符串小于定义的空间时,即使输入换行符,也不会结束输入,只有输入的超过空间时,输入换行符才会停止输入
     // 如果输入的最后一个空间恰好是换行,则停止输入;
     
     
     
     
     
     
     
  • 相关阅读:
    git忽略已提交过的文件方法
    去除git版本控制
    写博客的初衷
    Substring with Concatenation of All Words
    Course Schedule
    Reverse Words in a String--not finished yet
    Repeated DNA Sequences
    Maximum Product of Word
    Odd Even Linked List
    Reorder List
  • 原文地址:https://www.cnblogs.com/hcw110/p/9706094.html
Copyright © 2011-2022 走看看