这个题看起来比较简单,但实际上有些思维难度,现在想到的是模拟法,我们可以设好边界,然后从左上角开始遍历,沿着题目要求的顺序,沿着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){//先模拟第一行 topfor(int j=left;j<=right&&top<=bottom;j++){q[top][j]=k++;}top++;//模拟最后一列 rightfor(int i=top;i<=bottom&&left<=right;i++){q[i][right]=k++;}right--;//模拟最后一行 bottomfor(int j=right;j>=left&&top<=bottom;j--){q[bottom][j]=k++;}bottom--;//模拟第一列 leftfor(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;
}