中南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\n",fun(x,y,ans%4));
43             }
44             else
45                 ans++;
46             //printf ("")
47         }
48         if (T)
49         printf ("\n");
50     }
51     return 0;
52 }
 
时间: 2024-11-10 10:41:56

中南oj String and Arrays的相关文章

csu oj 1341 string and arrays

/*#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+

String StringBuffer Arrays 字符串修改 拼接

package Baozhuang; import java.util.Arrays; import java.util.Scanner; public class exe { public static void main(String[] args) { String s = "27O51I51022I8"; s = s.replace('O', '0'); s = s.replace('I', '1'); System.out.println(s); String s0 = &q

LeetCode OJ String to Integer (atoi) 字符串转数字

1 #include <iostream> 2 #include <assert.h> 3 using namespace std; 4 int ato(const char *str) { 5 int i=0,e=0,s=0; 6 int max=2147483647,min=-2147483648; 7 int f=1; 8 int tem[10]={0}; 9 unsigned int pan=0; 10 while(*str==' '){ //过滤掉连续空格 11 str+

从一道例题谈Arrays.toString()与其他String的转换方法

阅读该篇文章前,请大家事先阅读一下:   java.toString(),(String),String.valueOf的区别 有了上述基础后,我接下来谈谈从一道题目中获得的些许收获. 今天在做题是发现了非常重要的一点.题目来源:http://www.lintcode.com/en/problem/anagrams/ 我们先来看一下两种不同的解法: 解法一: /* use int[26] assuming it's all lowercase letters count each string

【华为OJ】【072-火车进站】

[华为OJ][算法总篇章] [华为OJ][072-火车进站] [工程下载] 题目描述 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车, 每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号 思路: 此处所谓字典序排序的意思是这n辆火车有多少种出站的可能顺序(也就是数据结构中的栈有多少种出栈顺序). 思路为用三个变量分别存储待进站火车,站中火车和已出站火车,其中待进站火车用Queue(队列)存储和站中 火车采用stack(栈)存储,已出站火车采用St

Arrays工具类

Arraysd的静态方法能够方便的对数组进行操作,每个方法也加了注释 : 程序: import java.util.*;public class Array{        public static void main(String[] args){                int[]  arr={1,3,4,2};                System.out.println("排序前:");                printArray(arr);//打印原数组

Java Arrays类

1 package demo04; 2 3 import java.util.Arrays; 4 5 public class ArraysDemo { 6 public static void main(String[] args) { 7 8 //static void sort(任意类型数组) 对数组升序排列 9 int[] arr = {5,1,2,6,3}; 10 Arrays.sort(arr); 11 for (int i = 0; i < arr.length; i++) { 1

Util包中Arrays

java.util 类 Arrays java.lang.Object -java.util.Arrays public class Arrays extends Object 此类包含用来操作数组(比如排序和搜索)的各种方法.此类还包含一个允许将数组作为列表来查看的静态工厂. 除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException. 此类中所含方法的文档都包括对实现 的简短描述.应该将这些描述视为实现注意事项,而不应将它们视为规范 的一

java 16 - 13 可变参数和Arrays工具类的asList()方法

可变参数:定义方法的时候不知道该定义多少个参数 格式: 修饰符 返回值类型 方法名(数据类型… 变量名){ } 注意: 这里的变量其实是一个数组 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个 1 import java.util.Scanner; 2 public class ArgsDemo { 3 4 public static void main(String[] args) { 5 int result = sum(1,2,3,4,5,6,7,8,9);//参与计