首先要说明的是,这是一道很好的二维数组转向练习题,因此 不可能! 不会太水
题意解析
给出一个不大于 9
的正整数 n
,输出 n×n
的蛇形方阵。
从左上角填上 1
开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有的会占用 3
个字符,前面使用空格补齐。
输入输出样例
输入#1:
4
输出#1:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
可见,规律为:右 → 下 → 左 → 上
代码实现
定义输入不解释
#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
int n,cnt=0,x=1,y=1; //cnt表示当前操作,x和y分别表示横纵坐标
cin>>n; //输入
return 0;
}
首先,把第一个数赋值为1
cube[1][1]=1; //赋值
然后,for
循环填数
for(int i=1;i<=n*n;i++) {
//...模拟代码
}
接下来,把每个点赋值
cube[x][y]=i; //赋值
最重要的来了,我们需要模拟每一种情况
模拟第一种情况(向右):
if(cnt%4==0 && y<n && cube[x][y+1]==0) y=y+1; //y坐标更新
模拟第二种情况(向下):
else if(cnt%4==1 && x<n && cube[x+1][y]==0) x=x+1; //x坐标更新
模拟第三种情况(向左):
else if(cnt%4==2 && y>1 && cube[x][y-1]==0) y=y-1; //y坐标更新
模拟第四种情况(向上):
else if(cnt%4==3 && x>1 && cube[x-1][y]==0) x=x-1; //x坐标更新
cnt
更新代码
else {
cnt++;
if(cnt%4==0) y=y+1;
else if(cnt%4==1) x=x+1;
else if(cnt%4==2) y=y-1;
else if(cnt%4==3) x=x-1;
}
最后,输出!
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(cube[i][j]>=10){ //判断是否为十位数
cout<<" "<<cube[i][j]; //如果是十位数,打印一个空格
}
else {
cout<<" "<<cube[i][j]; //如果是个位数,打印两个空格(补全)
}
}
cout<<endl; //换行,也可以写成 cout<<'\n';
}
整合代码如下:
#include <bits/stdc++.h>
using namespace std;
int cube[105][105];
int main ()
{
int n,cnt=0,x=1,y=1;
cin>>n;
cube[1][1]=1;
for(int i=1;i<=n*n;i++) {
cube[x][y]=i;
if(cnt%4==0 && y<n && cube[x][y+1]==0) y=y+1;
else if(cnt%4==1 && x<n && cube[x+1][y]==0) x=x+1;
else if(cnt%4==2 && y>1 && cube[x][y-1]==0) y=y-1;
else if(cnt%4==3 && x>1 && cube[x-1][y]==0) x=x-1;
else {
cnt++;
if(cnt%4==0) y=y+1;
else if(cnt%4==1) x=x+1;
else if(cnt%4==2) y=y-1;
else if(cnt%4==3) x=x-1;
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(cube[i][j]>=10){
cout<<" "<<cube[i][j];
}
else {
cout<<" "<<cube[i][j];
}
}
cout<<endl;
}
return 0;
}
当然啦,还有一种方法,不建议大家使用:打表
代码就不放了,打表法太水了
总体来说,这道题还是一道不错的题,适合练习二维数组和循环