闲着无聊写的题解系列

土间太平  •  4年前


首先必须歌颂一下答案,个位数前居然还有要留一个空格(也就是域宽为2);我提交上去三次才发现这玩意...

以下为给菜鸟看的

域宽是什么?就是在数字总共占的格数。举个例子

域宽:不设  

2

13

域宽:2

2

13

也就是说,在限定了域宽为2之后,不足2位的数字之前被打上了括号以使数字总共占到两个格子的位置。

域宽一般应用在乘法口诀表之类的题目上,比如

15678693401096.jpg

(网图,侵删)

我们可以看见,在限定了域宽之后数字对的特别整齐,很舒服。

域宽具体的设置方式为cout <<setw(int n) ,就是说在输出之前带上这么一个玩意儿,这之后照常进行就行。

记得带上iomanip头文件。

 

入门内容结束,接下来仍然是给菜鸟看的

 

接下来,来看看这题怎么入手吧

首先这个数列我们可以发现它是从右上角开始沿着顺时针往里面转动,一边转动一边收缩。

所以要怎么实现代码呢?

首先,定义一个二维数组保存这个数列。

int map[20][20];

这里把它放在全局变量上,以下几个也是。这是一个很好的习惯。

有了存数列的地盘,我们还要思考一下怎么让程序按部就班地逆时针转动;这里我们用一种很经典的方法——next数组。

int cnext[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; //直接写next编译会报错,所以改写做cnext
int wnext;

解释:wnext指的是执行第几个cnext。比如它应该向下转的时候就让wnext为0。这样就可以方便的控制方向了。不懂没关系,往下看。

我们假设输入的N为tar。

int x=tar-1,y=0; //从右上角开始所以要让x等于tar-1

for(int i=0;i<tar*tar;i++){
map[x][y]=i+1;
nx=x+cnext[wnext][0]; //nx与ny是存放下一步的位置的变量。
ny=y+cnext[wnext][1];
if(nx<0 || nx>=tar || ny<0 || ny>=tar || map[nx][ny]!=0){
wnext++;
if(wnext>=4) wnext=0;
}
x+=cnext[wnext][0];
y+=cnext[wnext][1];
}

一句一句来。i<tar*tar表示我一共要填tar平方个数字进去。因为i是从0开始算的,所以map[x][y]=i+1的时候就填i+1进去。

nx=x+cnext[wnext][0];
ny=y+cnext[wnext][1]; 

这里cnext数组和wnext的作用得到了体现。自己想想为什么这样写,这样写的目的是什么。

这里之所以要先把下一步的位置算出来是为了方便预先判断是否出界了。

那么如果出界的话我们就让wnext++。发现没有?cnext中顺序的编排是按照顺时针完成的。

既然我们判断完了出界与否,就可以大胆放心地让我们真正负责确定位置的x和y前进了。

x+=cnext[wnext][0];
y+=cnext[wnext][1]; 

最后数列填完了,我们就让他输出吧。

for(int i=0;i<tar;i++){
for(int j=0;j<tar;j++)
cout<<setw(2)<<map[j][i]<<" "<<flush;
cout<<endl;
}

想一想:为什么输出时是map[j][i]而不是map[i][j]

最后粘贴一下完整代码。还是那句老话,能力有限,代码优化肯定是不如隔壁大佬的。

#include <iostream>
#include <iomanip>
using namespace std;
int map[20][20];
int cnext[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int wnext;

int main() {
int tar=0;
cin>>tar;
int x=tar-1,y=0;
int nx,ny;
for(int i=0;i<tar*tar;i++){
map[x][y]=i+1;
nx=x+cnext[wnext][0];
ny=y+cnext[wnext][1];
if(nx<0 || nx>=tar || ny<0 || ny>=tar || map[nx][ny]!=0){
wnext++;
if(wnext>=4) wnext=0;
}
x+=cnext[wnext][0];
y+=cnext[wnext][1];
}
for(int i=0;i<tar;i++){
for(int j=0;j<tar;j++)
cout<<setw(2)<<map[j][i]<<" "<<flush;
cout<<endl;
}
return 0;
}
 

好了,感谢你能看到这里。

 

——By  一个现在有了名字并自称“鬼之太平”的萌新。第三篇。


评论:

楼主真的很棒,王码编程是一个特别年轻的平台,楼主能够乐于把做题的经验分享出来,已经是在帮助我们这个年轻的平台在进行成长,最近忙着上传一本通基础篇的内容,可能没有时间来发布一些题目的题解。等题目上传得差不多的时候,我会抽时间把一些较难的题目的题解发布出来


[系统管理员]  •  4年前

楼主如果可以的话请联系我们,我们准备了一点小礼品送给楼主(*^ω^*)


[系统管理员]  •  4年前

点击链接加入群聊【王码编程交流小组】:https://jq.qq.com/?_wv=1027&k=5Avu6Xp


[系统管理员]  •  4年前

请先登录,才能进行评论