3月23日
这个题目有两种方法
1.
第一种就是模拟,我们使用数组存储,按照
填写第一行
填写最后一列
填写最后一行
填写第一列
的顺序来,不断地减小循环的范围,过程中我们需要注意for循环里面的条件,拐点处要考虑一下for的初始条件要不要加一,第三四个,需要加上特别的判断条件(3为top<buttom,4为left<right),因为可能会出现最后只剩一条竖线或者一条横线的情况。
#include<iostream>
using namespace std;
int a[105][105];
int main()
{
int n,m;
cin>>n>>m;
int left=1,right=m,top=1,buttom=n;
int k=1;
while(left<=right&&top<=buttom)
{
for(int i=left;i<=right;i++)
{
a[top][i]=k;
k++;
}
top++;
for(int i=top;i<=buttom;i++)
{
a[i][right]=k;
k++;
}
right--;
for(int i=right;i>=left&&top-1<buttom;i--)
{
a[buttom][i]=k;
k++;
}
buttom--;
for(int i=buttom;i>=top&&left<right+1;i--)
{
a[i][left]=k;
k++;
}
left++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
2.
第二种是一种重要的技巧,我们需要拐弯的思想
#include <iostream>
using namespace std;
int res[105][105];
int main(){
int n ,m , d = 0 , x = 0 , y = 0;
int dx[] = {-1,0,1,0}; int dy[] = {0,1,0,-1};
cin >> n >> m ;
for (int i = 1 ; i <= m * n ; i++){
res[x][y] = i;
int a = x + dx[d] , b = y + dy[d];
if (a >= n || a < 0 || b >= m || b < 0 || res[a][b]){
d = (d + 1) % 4;
a = x + dx[d] ; b = y + dy[d];
}
x = a ; y = b;
}
for (int i = 0 ; i < n ; i++){
for (int j = 0 ; j < m ; j++)
cout << res[i][j] << ' ';
cout << endl;
}
return 0;
}