算法
模拟
方法
使用一个变量来记录方向(上下左右),若已经到达边界或按当时方向的下一个数已经被标记过,则改变方向
C++ 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+1e2;
ll n,m;
ll a[N][N];
ll ans;
ll fx=1;//方向(fx),1为右,2为下,3为左,4为上
ll x=1,y=1;
signed main()
{
cin>>n>>m;
while(ans!=n*m)
{
ans++;
a[x][y]=ans;
if(fx==1)
{
if(y==m||a[x][y+1]!=0)fx=2;//到达边界或下一个数被标记过
else y++;
}
if(fx==2)
{
if(x==n||a[x+1][y]!=0)fx=3;//到达边界或下一个数被标记过
else x++;
}
if(fx==3)
{
if(y==1||a[x][y-1]!=0)fx=4;//到达边界或下一个数被标记过
else y--;
}
if(fx==4)
{
if(x==1||a[x-1][y]!=0)fx=1,y++;//到达边界或下一个数被标记过,【注】:由于fx=1后没有if语句,会导致重叠,要另加y++
else x--;
}
}
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
是因为 如果是else if 就不会进行 下面的 f=2 f=3 里边 直接回到上边 从头开始了 是吧?
大佬 我想问下 为啥换成else if 输出结果就不对了
私信