有一个N*N的字符矩阵,从上到下依次记为第1行,第2行,……,第N行,从左至右依次记为第1列,第2列,……,第N列。
对于这个矩阵会进行一系列操作,但这些操作只有两类:
(1) R: 将矩阵逆时针旋转90度;
(2)
P x y: 将此时第x行第y列的字符打印出来,其中1 <=
x, y <= N。
标签:
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2072&pid=1
有一个N*N的字符矩阵,从上到下依次记为第1行,第2行,……,第N行,从左至右依次记为第1列,第2列,……,第N列。
对于这个矩阵会进行一系列操作,但这些操作只有两类:
(1) R: 将矩阵逆时针旋转90度;
(2)
P x y: 将此时第x行第y列的字符打印出来,其中1 <=
x, y <= N。
输入数据的第一行包含一个整数T (1 <= T <= 20),表示接下来一共有T组测试数据。
对于每组测试数据,第一行包含一个整数N (1 <= N <=
300),含义同上。接下来一共有N行,每行均包含N个大写字母,描述了这个矩阵的初始情况。再接下来一行包含一个整数M
(1 <= M <=
10000),表示一共对矩阵进行了M次操作。接下来M行,每行均包含一个符合上述格式的操作,依次描述了这M个操作。
对于每个第(2)类操作,用一行打印出指定位置的字符。
相邻的两组测试数据中间用一个空行隔开。
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
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 }
标签:
原文地址:http://www.cnblogs.com/qq-star/p/4379193.html