这个题目呢,就是一个暴力模拟就好啦,但是呢写得好的话会达到事半功倍的效果,写得不好的话就会使得调试很麻烦。
对于每一次移动我们其实可以看成是不断地交换两个数(具体的细节请看代码哦),这么写的话就会使思路很清晰很模式化,可以说打字的速度有多快,那么写题的速度就有多快。
然后对于这样的题目还要注意的是,你的下标是从0开始的还是从1开始的。
还有就是读入字符之前要提防换行符号的影响,要么在读入前空一格,要么加一个getchar()
上代码喽:
初级版:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define ll __int64;
int ans[15][15];
int n,m;
void solve(){
char cmd;
int x,y;
scanf(" %c%d%d",&cmd,&x,&y); //注意就是这个空格是用来吸收换行符号的,前面也可以用getchar()哦
for(int i=0;i<y;i++){ //运动y次哦
if(cmd=='L'){ //向左运动相当于就是从第一个开始不断和后面的交换,那么第一个就会移动到最后一个
for(int j=2;j<=n;j++){
int t=ans[x][j-1];
ans[x][j-1]=ans[x][j];
ans[x][j]=t;
}
}
else if(cmd=='R'){
for(int j=n;j>1;j--){//注意这个要从第n个开始,因为我要把最后一个移动到最前面
int t=ans[x][j-1];
ans[x][j-1]=ans[x][j];
ans[x][j]=t;
}
}
else if(cmd=='U'){
for(int j=2;j<=n;j++){
int t=ans[j-1][x];
ans[j-1][x]=ans[j][x];
ans[j][x]=t;
}
}
else{
for(int j=n;j>1;j--){
int t=ans[j-1][x];
ans[j-1][x]=ans[j][x];
ans[j][x]=t;
}
}
}
}
int main(){
int k;
scanf("%d",&k);
while(k--){
scanf("%d%d",&n,&m); //表示的是矩阵的大小和指令的条数
//初始化矩阵
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j]=++cnt;
}
}
while(m--){ //这个是m条指令哦
solve();
}
//输出结果
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==n&&j==n) printf("%d\n",ans[i][j]);
else printf("%d ",ans[i][j]);
}
}
}
return 0;
}
中级版:
写一个swap()函数,用来交换两个数,这里涉及到了指针,因为函数都是传的参数,因此要用指针才可以交换两个数
#include <stdio.h>
#include <math.h>
#include <string.h>
#define ll __int64;
int ans[15][15];
int n,m;
//这里涉及到了指针
void swap(int* a,int* b){
int t=*a;//*这个是解地址符号
*a=*b;
*b=t;
}
void solve(){
char cmd;
int x,y;
scanf(" %c%d%d",&cmd,&x,&y); //注意就是这个空格是用来吸收换行符号的,前面也可以用getchar()哦
for(int i=0;i<y;i++){ //运动y次哦
if(cmd=='L'){
for(int j=2;j<=n;j++)
swap(&ans[x][j-1],&ans[x][j]);//&这个是取地址符号
}
else if(cmd=='R'){
for(int j=n;j>1;j--)
swap(&ans[x][j-1],&ans[x][j]);
}
else if(cmd=='U'){
for(int j=2;j<=n;j++)
swap(&ans[j-1][x],&ans[j][x]);
}
else{
for(int j=n;j>1;j--)
swap(&ans[j-1][x],&ans[j][x]);
}
}
}
int main(){
int k;
scanf("%d",&k);
while(k--){
scanf("%d%d",&n,&m); //表示的是矩阵的大小和指令的条数
//初始化矩阵
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j]=++cnt;
}
}
while(m--){ //这个是m条指令哦
solve();
}
//输出结果
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==n&&j==n) printf("%d\n",ans[i][j]);
else printf("%d ",ans[i][j]);
}
}
}
return 0;
}
高级版:(我们不用一步一步地走,可以一次性到位,这个思想和一个游戏那个题目很像)
#include <stdio.h>
#include <math.h>
#include <string.h>
int ans[15][15];
int ret[15][15];
int n,m;
void solve(){
char cmd;
int x,y;
scanf(" %c%d%d",&cmd,&x,&y); //注意就是这个空格是用来吸收换行符号的,前面也可以用getchar()哦
x--;//因为我的下标是从0开始的
for(int i=0;i<n;i++){ //运动y次哦
if(cmd=='L') ret[x][(i-y+n)%n]=ans[x][i];//取余是防止下标超过n,+n是为了防止下标出现负数哦
else if(cmd=='R') ret[x][(i+y)%n]=ans[x][i];
else if(cmd=='U') ret[(i-y+n)%n][x]=ans[i][x];
else ret[(i+y)%n][x]=ans[i][x];
}
}
int main(){
int k;
scanf("%d",&k);
while(k--){
scanf("%d%d",&n,&m); //表示的是矩阵的大小和指令的条数
//初始化结果矩阵
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ret[i][j]=++cnt;
}
}
while(m--){ //这个是m条指令哦
//每一次运动前都需要更新ans里面每个数的结果
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ans[i][j]=ret[i][j];
}
}
solve();
}
//输出结果
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==n-1&&j==n-1) printf("%d\n",ret[i][j]);
else printf("%d ",ret[i][j]);
}
}
}
return 0;
}
好啦,我们明天再见!继续加油哦