这个题看起来比较简单,但实际上有些思维难度,现在想到的是模拟法,我们可以设好边界,然后从左上角开始遍历,沿着题目要求的顺序,沿着top left right bottom这四个边依次来做。
模拟过程有很多坑,比如边界问题。我采用的是把遍历一次过后,把这个调节往里缩小一个单位。当两侧边界重合的时候结束循环。
每一个小的循环,需要考虑每一处的边界,是否重合。
上代码:
#include<bits/stdc++.h>
using namespace std;
int q[101][101];
//定义好边界
int main(){
int n,m;
cin>>n>>m;
int left=0,right=m-1,top=0,bottom=n-1;
int k=1;
while(left<=right||top<=bottom){
//先模拟第一行 top
for(int j=left;j<=right&&top<=bottom;j++){
q[top][j]=k++;
}
top++;
//模拟最后一列 right
for(int i=top;i<=bottom&&left<=right;i++){
q[i][right]=k++;
}
right--;
//模拟最后一行 bottom
for(int j=right;j>=left&&top<=bottom;j--){
q[bottom][j]=k++;
}
bottom--;
//模拟第一列 left
for(int i=bottom;i>=top&&left<=right;i--){
q[i][left]=k++;
}
left++;
}
//输出
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<q[i][j]<<" ";
}
cout<<endl;
}
return 0;
}