无论是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;
}