这又是一道很简单的题,打印环形数组,原题
之前就写过,用的是比较简单的4个while,因为可以简单的判断是否为零,来确定是否到边界。
#include<iostream>
#include<algorithm>
using namespace std;
int a[1005][1005];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
int x=1,y=1,ans=1;
a[x][y]=1;
while(ans<n*m)
{
while(y<m&&!a[x][y+1]) a[x][++y] = ++ans;
while(x<n&&!a[x+1][y]) a[++x][y] = ++ans;
while(y>1&&!a[x][y-1]) a[x][--y] = ++ans;
while(x>1&&!a[x-1][y]) a[--x][y] = ++ans;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<'\n';
}
return 0;
}
可是今天写时,没想到这一点,定义了4个变量,来更新边界,错了,一直以为是换行空格的错误,其实是特殊情况n/m,为1时,这时候脑子有抽了,以为按环形理念是这样的(135642)这样一上一下,或一左一右。直到赛后运行了别人正确的代码,才知道不过是(123456)如此简单。又修改,终于对了,虽然下面这个比较复杂,但毕竟中了十几发罚时,改出来的,也放下面了。是我心急了?每次的罚时太多了,不能再瞎改了
#include<iostream>
#include<algorithm>
using namespace std;
long long a[1005][1005];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
long long n,m,f=0,j=0,sum=1;
cin>>n>>m;
long long g=n,h=m;
if(n==1)
{
sum=1;
for(int i=0;i<m;i++)
{
a[0][i]=sum++;
}
}
else if(m==1)
{
sum=1;
for(int i=0;i<n;i++)
{
a[i][0]=sum++;
}
}
else
{
sum=1;
while(sum<=n*m)
{
for(int i=j;i<h;i++)
a[f][i]=sum++;
f++;
for(int i=f;i<g;i++)
a[i][h-1]=sum++;
h--;
for(int i=h-1;i>=j;i--)
a[g-1][i]=sum++;
g--;
for(int i=g-1;i>=f;i--)
a[i][j]=sum++;
j++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<=m-1;j++)
cout<<a[i][j]<<" ";
cout<<'\n';
}
return 0;
}