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")则可以读取输入空格符和换行符。当读入的字符串小于定义的空间时,即使输入换行符,也不会结束输入,只有输入的超过空间时,输入换行符才会停止输入
// 如果输入的最后一个空间恰好是换行,则停止输入;