1258--矩阵--2023/1/8

这个题目呢,就是一个暴力模拟就好啦,但是呢写得好的话会达到事半功倍的效果,写得不好的话就会使得调试很麻烦。

对于每一次移动我们其实可以看成是不断地交换两个数(具体的细节请看代码哦),这么写的话就会使思路很清晰很模式化,可以说打字的速度有多快,那么写题的速度就有多快。

然后对于这样的题目还要注意的是,你的下标是从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;
}

好啦,我们明天再见!继续加油哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值