问题描述
问题分析:1.方向什么时候变 2.方向怎么变
第一圈中,从首元素开始,向右递增直到最大列,然后向下递增,到最大行后,再向上运动,直到遇到首字母,在后面的转圈中,遇到已填充的数就改变方向,所以我们可以定义一个数组,初始值为零,那么改变方向的条件有两个,一是即将填充的位置出界,二是即将填充的位置不为零;考虑玩方向改变的条件后,在考虑方向改变的规律,不难发现,是→↓←↑......转换到行列坐标中就是(0,1)(1,0)(0,-1)(-1,0)
所以代码如下
#include<iostream>
using namespace std;
const int N = 101;
int cnt[N][N];
int main()
{
int n,m,k=1;
cin>>n>>m;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1},x,y;//dx对应列变换
for(int a=0,b=0,d=0;k<=m*n;k++)
{
cnt[a][b]=k;
x=a+dy[d];
y=b+dx[d];
if(x<0||x>=n||y<0||y>=m||cnt[x][y])//变向条件
{
d=(d+1)%4;//方向变化的周期为四
x=a+dy[d];
y=b+dx[d];
}
a=x;
b=y;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<cnt[i][j]<<' ';
cout<<endl;
}
return 0;
}