Problem Description
在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这样了,于是他的思想是单一的,他总是喜欢从一点出发,经过3次转折(每次向右转90°),回到出发点,而且呢,他每次转折前总是跑相同长度的路程,所以很多人都想知道如果用‘1’算他跑步出发的第一个残影的话,那么回到起点的时候,他的残影是怎么样的呢?
Input
测试数据有多行,每一行为一个数N(1<=N<=10)(以0结尾,0不做处理),即仙人球在没有回到起点的时候,跑过留下N个残影后突然90°右转。
Output
每组测试数据输出一个结果,并且每个残影的计数位长度为3个字符长度。(当然N等于1的话,它的结果也是占用3个字符位置的)
Sample Input
4
2008信息工程学院集训队——选拔赛
这题看到以后第一时间想到的是蛇形填数,但是这个和蛇形填数不同的地方是中间的空白是没有东西的,所以只能靠模拟来做,我是找到了规律,然后一点一点调试出来的,刚调完上面的发现只能过一个样例,于是又调了半天才调好的
代码:
#include<bits/stdc++.h>
using namespace std;
int ans[100];
int main() {
int n;
while(cin>>n&&n) {
for(int i=1;i<=100;i++)
ans[i]=i;
for(int i=1;i<=n;i++) {
if(i==1) {
for(int j=1;j<=n;j++)
printf("%3d",ans[j]);
cout<<endl;
}
else if(i>1&&i<n) {
printf("%3d",ans[4*(n-1)-(i-2)]);
for(int k=0;k<(n-2);k++)
cout<<" ";
printf("%3d",ans[n+i-1]);
cout<<endl;
}
else if(i==n) {
for(int j=1;j<=n;j++)
printf("%3d",ans[4*(n-1)-i-j+3]);
}
}
cout<<endl;
}
}
注意输出的时候%3d是必要格式,因为题目里写了即使输出一个也占三格。
如果找不到规律的话怎么办呢,那就只能硬做了:
写一个ans1 = (n-1)4 正好等于样例里的12 但是我刚开始写的3n在别的数字里结果就不对了,然后ans2=n+1没有问题,用外层for循环来控制一下循环次数,用内循环来在每一行填数由于去掉第一行和最后一行,所以外循环是n-2到0,j=1的话就输出大的ans1 然后让ans1-- 如果j=n的话就输出ans2 让ans2++ 最后再输出最后一行就行了,正好用到了ans1和ans2来控制输出 刚开始我加了个关闭同步,然后printf和cout昏迷了 cout的东西就是输出不了,把关闭同步删掉就ac了 代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
while(cin>>n&&n) {
if(n==1) {
printf("%3d",1);
cout<<endl;
continue;
}
for(int i=1;i<=n;i++)
printf("%3d",i);
cout<<endl;
int t=(n-1)*4;
int ans1=t;
int ans2=n+1;
for(int i=n-2;i>0;i--)
for(int j=1;j<=n;j++) {
if(j==1) {
printf("%3d",ans1);
ans1--;
}
else if(j==n) {
printf("%3d",ans2);
cout<<endl;
ans2++;
}
else
cout<<" ";
}
for(int i=ans1;i>=ans2;i--)
printf("%3d",i);
cout<<endl;
}
}