NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛测试数据(初中组)
第二题:
解析:
本题,主要是循环体的运用,综合难度比较大。循环体结构的设计是本题的解题关键。
具体代码如下:
#include <QCoreApplication>
#include<iostream>
//#include<stdio.h>
#include<cstdio>
#include<string.h>
using namespace std;
int sortPlace(int size);
void printNums(int size);
const int MAXN = 1000;
int numberlist[MAXN] = {};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//cout<<"helloworld!"<<endl;
int size; //定义层数
cout<<"please input size:"<<endl;
cin>>size;
cout<<"the size is :"<<size<<endl;
sortPlace(size);
printNums(size);
return a.exec();
}
int sortPlace(int size)
{
int diff_s = size;
int loop = 1;
if(size>2)
{
loop = size%2?size/2+1:size/2; //size 的奇偶影响循环次数
}
cout<<loop; //输出循环次数
int addtemp = 0;
while(loop>0) //每一次的循环来来决定四个边长的数字
{
//计算当前圈的起点
static int startNum = 0;
for(int i = 1;i<=size;i++)
{
// //末列
numberlist[diff_s*i-1+ (diff_s-1) *addtemp] = i +startNum ;
//末行
numberlist[(diff_s-1)*diff_s-1 + i -(diff_s-1)*addtemp] = size*2-i + startNum;
//第一列
numberlist[diff_s*(i-1)+(diff_s+1)*addtemp] = size*3-1-i + startNum;
}
if(size>=3)
{
//第一行中间几个数字
for(int i = 1;i<=size-2;i++)
{
numberlist[i+(diff_s+1)*addtemp]=size*3-2+i + startNum;
}
}
if(loop>=2)
{
startNum = size*4-4 +startNum; //loop =1;
cout<<"the start Num is:"<<startNum<<endl;
}
loop--;
addtemp++;
size =size-2;
cout<<"the loop now is:"<<loop<<" "<<endl;
cout<<"the size now is:"<<size<<endl;
}
return 0;
}
void printNums(int size)
{
int totalNum = size*size;
for(int i=0;i<totalNum;i++)
{
cout.width(4);
cout<<numberlist[i]<<" ";
if((i+1)%size == 0)
{
cout<<endl;
}
}
}
输出:
附注:
该题的难度比较大,对初中生来说,要求还是高了点。不过针对这类的题型还是可以通过一定量的练习来提高解题的速度。