C++ 洛谷练习题 · 蛇形方阵

首先要说明的是,这是一道很好的二维数组转向练习题,因此 不可能! 不会太水

题意解析

给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。

从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有的会占用 3 个字符,前面使用空格补齐。

输入输出样例

输入#1:

4

输出#1:

  1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

可见,规律为:右 → 下 → 左 → 上

代码实现

定义输入不解释

#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
	int n,cnt=0,x=1,y=1; //cnt表示当前操作,x和y分别表示横纵坐标
	cin>>n; //输入
    return 0;
}

首先,把第一个数赋值为1

cube[1][1]=1; //赋值

然后,for循环填数

for(int i=1;i<=n*n;i++) {
	//...模拟代码
}

接下来,把每个点赋值

cube[x][y]=i; //赋值

最重要的来了,我们需要模拟每一种情况

模拟第一种情况(向右):

if(cnt%4==0 && y<n && cube[x][y+1]==0) y=y+1; //y坐标更新

模拟第二种情况(向下):

else if(cnt%4==1 && x<n && cube[x+1][y]==0) x=x+1; //x坐标更新

模拟第三种情况(向左):

else if(cnt%4==2 && y>1 && cube[x][y-1]==0) y=y-1; //y坐标更新

模拟第四种情况(向上):

else if(cnt%4==3 && x>1 && cube[x-1][y]==0) x=x-1; //x坐标更新

cnt更新代码

else {
	cnt++;
	if(cnt%4==0) y=y+1;
	else if(cnt%4==1) x=x+1;
	else if(cnt%4==2) y=y-1;
	else if(cnt%4==3) x=x-1;
}

最后,输出!

for(int i=1;i<=n;i++) {
	for(int j=1;j<=n;j++) {
		if(cube[i][j]>=10){ //判断是否为十位数
			cout<<" "<<cube[i][j]; //如果是十位数,打印一个空格
		}
		else {
			cout<<"  "<<cube[i][j]; //如果是个位数,打印两个空格(补全)
		}
	}
	cout<<endl; //换行,也可以写成 cout<<'\n';
}

整合代码如下:

#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
	int n,cnt=0,x=1,y=1;
	cin>>n;
	cube[1][1]=1;
	for(int i=1;i<=n*n;i++) {
		cube[x][y]=i;
		if(cnt%4==0 && y<n && cube[x][y+1]==0) y=y+1;
		else if(cnt%4==1 && x<n && cube[x+1][y]==0) x=x+1;
		else if(cnt%4==2 && y>1 && cube[x][y-1]==0) y=y-1;
		else if(cnt%4==3 && x>1 && cube[x-1][y]==0) x=x-1;
		else {
			cnt++;
			if(cnt%4==0) y=y+1;
			else if(cnt%4==1) x=x+1;
			else if(cnt%4==2) y=y-1;
			else if(cnt%4==3) x=x-1;
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			if(cube[i][j]>=10){
				cout<<" "<<cube[i][j];
			}
			else {
				cout<<"  "<<cube[i][j];
			}
		}
		cout<<endl;
	}
	return 0;
}

Accepted
当然啦,还有一种方法,不建议大家使用:打表
代码就不放了,打表法太水了

总体来说,这道题还是一道不错的题,适合练习二维数组和循环


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值