下图是整体的移动思路,以5*5作为例子;
重点在于直行判停和转弯
下面是代码
//整体思想,来回转圈,碰到已经填过的就停
//停了之后就向下一个位置左移/右移
using namespace std;
#include <iostream>
#include <iomanip>
//这个主要是用那个setw函数
int main ()
{
int n; //n行n列 的蛇形方阵
cin>>n;
int num=1; //转圈标号的号
int i,j; //i指的是行,j指的是列,注意初始化
int a[n][n]={0};//存结果 ,注意初始化
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=0;
}
}
i=0;
j=0;
while(num<=n*n)
{
//右
while(a[i][j]==0&&j<n)
{
a[i][j]=num;
//cout<<i<<" 右"<<j<<" "<<a[i][j]<<endl;
j=j+1;
num=num+1;
}
j=j-1;
i=i+1;
//下
while(a[i][j]==0&&i<n)
{
a[i][j]=num;
//cout<<i<<" 下"<<j<<" "<<a[i][j]<<endl;
i=i+1;
num=num+1;
}
i=i-1;
j=j-1;
//左
while(a[i][j]==0&&j>=0)
{
a[i][j]=num;
//cout<<i<<" 左"<<j<<" "<<a[i][j]<<endl;
j=j-1;
num=num+1;
}
j=j+1;
i=i-1;
//上
while(a[i][j]==0&&i>=0)
{
a[i][j]=num;
//cout<<i<<" 上"<<j<<" "<<a[i][j]<<endl;
i=i-1;
num=num+1;
}
i=i+1;
j=j+1;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(3)<<a[i][j];
}
cout<<endl;
}
return 0;
}
注意输出方式,setw函数的用法,请跳转此博客理解
setw函数用法