题目描述
输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数n和m。
输出格式
输出满足要求的矩阵。
矩阵占n行,每行包含m个空格隔开的整数。
数据范围
1≤n,m≤100
样例
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
边界控制法(受二分边界控制所启示)
设置上下左右边界,每当填完一圈时四周边界收窄。
注意:
1.每一圈的最后一步要注意螺旋拐点去掉等号,如代码处: i>up
2.当n!=m时,行与列失去同步性,还要加一层控制使所填数据连贯不至于覆盖重填,如代码处: &&p<k
3.要注意消除for循环的副作用(for循环出口在最后一步往往刹车失灵多走一步)
4.要注意回退后向前走一步再填数,防止覆盖掉已经填好的数
做好这个题目后,你就是一个初级的控制系魂师了!!!哈哈哈
视频讲解--->百度网盘链接:https://pan.baidu.com/s/1TWtWN6nwDOaY45G8WbmI2Q 密码:xg3z
C++ 代码
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int s[n+1][m+1],i,j,left=0,right=m-1,up=0,down=n-1,p=0,k=n*m;
while(left<=right&&up<=down){
for (i=up,j=left;j<=right&&p<k;++j) s[i][j]=++p;
for (i++,j--;i<= down&&p<k;++i) s[i][j]=++p;
for (i--,j--;j>=left&&p<k; --j) s[i][j]=++p;
for (i--,j++;i>up&&p<k; --i) s[i][j]=++p;
left++,right--,up++,down--;
}
for (i = 0; i < n; ++i){
for ( j = 0; j < m; ++j) printf("%d ",s[i][j]);
printf("\n");
}
return 0;
}