#556. 蛇形矩阵(3月23日)

在这里插入图片描述
在这里插入图片描述
无论是3x3阶的还是4x4阶的这个方阵都是先从发最左上角出发为1起点,然后向右,到达边界后向下,再到达边界之后向左,再向上。数字的存放走向就是一个蛇型的循环。

在这里以3阶的为例。

a[1][1]一定为1,先往右走到达边界就停下来。但是如果我们以4阶的为例当我们走过右下左上一个循环后又要继续往右走,如果只是判断不穿过边界的话就会覆盖之前走的方格。所以我们要标记我们已经走过的地方避免重复。
在这里插入图片描述
在这里建立二维数组是我们将其全部位置赋值为0,标记为我们没有做过的方格。无论如何我们都是从a[1][1]开始的所以将其赋值为1.然后我们再次执行右下左上的循环。

向右判断: while(a[i][j+1] == 0 && j+1<=m )
右边的方格为0没有走过:a[i][j+1] == 0
没有超过右边界:j+1<=m

向下判断: while(a[i+1][j] == 0 && i+1<=n)
下边的方格为0没有走过:a[i][j+1] == 0
没有超过下边界:i+1<=n

向左判断: while(a[i][j-1] == 0 && j-1>0)
左边的方格为0没有走过:a[i][j-1] == 0
没有超过左边界:j-1>0

向上判断: while(a[i-1][j] == 0 && i-1>0)
上边的方格为0没有走过:a[i-1][j] == 0
没有超过上边界:i-1>0

循环执行以上四步知道 我们存进去的值=n*m为止。

注意:
在向右走时边界要小于等于m而不是n。
在向右走时边界要小于等于n而不是m。
也就我这个笨b错在这个地方卡了半小时。(/_\)大笨b

#include<iostream>
#include<algorithm>
#define N 101
using namespace std;

int main(){
	int n,m;
	cin>>n>>m;
	int x = 1;
	int a[N][N] = {0};
	int i = 1,j = 1;
	a[1][1] = x;
	while(x<n*m){
		//右 
		while(a[i][j+1] == 0 && j+1<=m ){
			j++; x++;
			a[i][j] = x;
		}
		//下
		while(a[i+1][j] == 0 && i+1<=n) {
			i++;x++;
			a[i][j] = x;
		}
		//左
		while(a[i][j-1] == 0 && j-1>0) {
			j--;x++;
			a[i][j] = x;
		}
		//向上
		while(a[i-1][j] == 0 && i-1>0) {
			i--;x++;
			a[i][j] = x;
		} 
	}
for(int i = 1;i<=n;i++){
	for(int j = 1;j<=m;j++){
		cout<<a[i][j]<<" ";
	}
	cout<<endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值