第六届程序设计比赛题目与答案

合集下载

C程序设计第六届竞赛试题1

C程序设计第六届竞赛试题1

第六届c程序设计竞赛试题试题一素数问题走进世博园某信息通信馆,参观者将获得前所未有的尖端互动体验,一场充满创想和喜悦的信息通信互动体验秀将以全新形式呈现,从观众踏入展馆的第一步起,就将与手持终端密不可分,人类未来梦想的惊喜从参观者的掌上展开。

在等候区的梦想花园中,参观者便开始了他们奇妙的体验之旅,等待中的游客可利用手机等终端参加互动小游戏,与梦想剧场内的虚拟人物Kr Kong进行猜数比赛。

当屏幕出现一个整数x时,若你能比Kr Kong更快的发出最接近它的素数答案,你将会获得一个意想不到的礼物。

例如:当屏幕出现22时,你的回答应该是23;当屏幕出现8时,你的回答应是7;若x本身是素数,则回答x;若接近x的素数有两个时,则回答大于它的素数。

标准输入第一行:N 要竞猜的整数个数接下来有N行,每行只有一个正整数x标准输出输出有N行,每行是对应x的最接近它的素数。

约束条件1<=N<=5 1<=x<=1000样例输入382325样例输出72323#include<stdio.h>#include<math.h>void main(){int prime(int m);int N,i,a[5];int compare1,compare2;while(N<1||N>5){scanf("%d",&N);if(N<1||N>5)printf("输入有误请重新输入:\n"); }for(i=0;i<N;i++){scanf("%d",&a[i]);}printf("\n");for(i=0;i<N;i++){if(prime(a[i]))printf("%d\n",a[i]);else{compare1=a[i];compare2=a[i];while(1){compare1=compare1+1;if(prime(compare1))break;}while(1){compare2=compare2-1;if(prime(compare2))break;}if(compare1-a[i]<a[i]-compare2)printf("%d\n",compare1);else if(compare1-a[i]>a[i]-compare2)printf("%d\n",compare2);else if(compare1-a[i]==a[i]-compare2)printf("%d\n",compare1);elseprintf("error!\n");}}printf("\n");}int prime(int m){int i,n;if(m==1)return 0;n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0){return 0;}return 1;}试题二救灾投放物质问题灾区已经非常困难,灾民需要帐篷、衣物、食品和血浆。

第六届蓝桥杯程序设计大赛题目及答案

第六届蓝桥杯程序设计大赛题目及答案

第六届省赛1.方程整数解方程: a^2 + b^2 + c^2 = 1000(或参见【图1.jpg】)这个方程有整数解吗?有:a,b,c=6,8,30 就是一组解。

你能算出另一组合适的解吗?请填写该解中最小的数字。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

10#include<stdio.h>int main(){int a,b,c;for(a=1;a*a<=1000;a++){for(b=1;b*b<=1000;b++){for(c=1;c*c<=1000;c++){if(a*a+b*b+c*c==1000){printf("%d %d %d\n",a,b,c);}}}}return 0;}2.星系炸弹在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

每个炸弹都可以设定多少天之后爆炸。

比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。

比如:2015-02-19 请严格按照格式书写。

不能出现其它文字或符号。

2017-08-05#include <stdio.h>int main(){int monthDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};int days=1000;int year=2014, month=11, day=9;int i;for(i=0;i<days;i++){day++;if(day>monthDays[month-1]){day=1;month++;if(month>12){month=1;year++;if((year%400==0) ||(year%4==0 && year%100!=0))monthDays[1]=29;elsemonthDays[1]=28;}}}printf("%d-%d-%d\n",year,month,day);getchar();return 0;}3.奇妙的数字小明发现了一个奇妙的数字。

程序设计大赛试题及答案

程序设计大赛试题及答案

试题1、数学黑洞(程序文件名maths.c/maths.cpp)【问题描述】任给一个4位正整数,其各位数位上的数字不全相同,将数字重新组合成一个最大的数与最小的数相减,重复这个过程,最多7步,必得6174。

对任给的4位正整数(各位数位上的数字不全相同),编程输出掉进黑洞的步数。

【输入】一行,一个4位正整数n(1000< n<9999)【输出】掉进黑洞的步数输入1234输出32、进制转换(程序文件名conver.c/conver.cpp)【问题描述】任给一个十进制整数n,及正整数m(m<=16且m≠10), 将n转换成m进制并输出。

【输入】一行,两个整数n,m(0 ≤ n ≤ 500000,2 ≤ m ≤ 16,且m≠10),中间用一个空格隔开,其中n 表示十进制数。

【输出】转换后的数【输入输出样例】输入255 8输出3773、分数线划定(程序文件名score.c/score.cpp)【问题描述】公务员选拔工作正在 A 市如火如荼的进行。

为了选拔优秀人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。

面试分数线根据计划录取人数的150%划定,即如果计划录取m名公务员,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

【输入】第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的人数。

输入数据保证m*150%向下取整后小于等于n。

第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。

数据保证选手的报名号各不相同。

程序设计趣味赛题目

程序设计趣味赛题目

程序设计趣味赛题目一、基础题(3选2,每道5分,最高10分)1.题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

2.题目:海滩上有一堆桃子,五只猴子来分。

第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。

第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?3.题目:编写一个函数,根据输入的行数来输出杨辉三角形。

注:杨辉三角形的规律如下:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1…..二、图形题:(3选2,每题101.题目:编写程序,使运行结果呈现“”的形状,可用星号表现出来,也可用其他符号。

2.题目:编写程序,使运行结果呈现“”的形状,可用星号表现出来,也可用其他符号。

3.题目:编写程序,使运行结果呈现“”的形状,可用星号表现出来,也可用其他符号。

例:编写程序,使运行结果呈现(以上题目不允许用直接打印法)三、串类题:(3选2,每题10分,最高20分)1.题目:写一个函数,其功能是将两个字符串重复出现的字符删除后合并成一个字符串输出。

2.题目:编写一个程序,其功能是将2个字符串合并成一个字符串后,再实现前m个和最后m个的位置转换后输出。

3.题目:计算字符串中子串出现的次数。

四、生活模拟题:(每题10分)1.丁叔刚开始接触电脑就喜欢上了在论坛灌水。

虽然他经营农场很有那么一套,但是到了电脑面前就成了小白。

由于对电脑操作完全不熟悉,他总是找不到一种快速生成超长文本进行灌水的方法,每次都要在键盘上一个一个地敲入成百上千个字符。

终于,丁叔再也无法忍受了,花了一天的时间学习电脑,总算学会了复制、粘贴等基本操作的使用,假设丁叔敲入一个字符需要1个时间单位,复制任何连续的一段已输入的内容需要5个时间单位,粘贴一次需要2个时间单位,那么丁叔生成一段至少包含N个字符的文本最少需要多长时间2.给定n个点的坐标(x,y,z),且n<=50,从点1出发,怎么样才能走一条路径,访问每个点一次且仅一次,使走过的距离和最小?五、初涉acm:简单中文acm题目(输入输出要严格按照题目设定的要求)(每题15分)1.题目:汽车到哪了?Description长途坐车真难受,人们可能在车上早早睡着了,等到醒来的时候,车行驶到哪了?假如长途车经过一些城镇,现在知道长途车行驶路线上相邻的城镇之间的距离和车从出发时算已经行驶的距离,请计算出汽车行驶到哪个城镇或哪两个城镇之间Input(输入格式)第一行是一个整数T,代表接下来有多少组数据接下来是各组数据,每一组数据的第一行是两个整数N,M,分别表示城镇数目(包括起点和终点城镇)和要询问多少次到哪了。

第六届河南省程序设计大赛试题

第六届河南省程序设计大赛试题

河南省第六届大学生程序设计竞赛主办:河南省计算机学会承办:河南南阳理工学院(正式赛)地点:河南南阳理工学院时间:2013年5月12日( 9:00---14:00 )【T1 】异形卵我们探索宇宙,是想了解浩瀚星空的奥妙,但我们却很少意识到宇宙深处藏匿的危险,它们无时无刻不紧盯着我们的地球。

如果外星人拜访我们,结果可能与哥伦布当年踏足美洲大陆不会有什么两样,这是历史,也是现实。

在ZDM-777星球上发现的休眠异形卵,其外表与常见的卵不同,表面被一层石墨覆盖。

当人走近时,那层石墨开始消融,能看到里面的异形卵正在活动,异形卵是活物,具备一些热量或压力传感器这些基本的中枢神经系统,通过感知周围的热量,选择热量最大处寄生。

不过,假如周围有不适合被寄生处,异形卵就选择休眠。

周围的热量可以用一串整数a1,a2,……,a n来表示,异形卵具有一定的长度L,异形卵总是选择a i+a i+1+…+a i+L-1达到最大值处寄生。

若周围的热量低于0,异形卵则选择休眠。

异形卵是如何感知它的寄生处呢?【标准输入】第一行:K表示有多少组测试数据。

接下来对每组测试数据有2行,第1行: L N第2行:a1 a2 ……a N【标准输出】对于每组测试数据,输出一行:异形卵能寄生的起始位置。

若有多处可以寄生,则选择小的起始位置。

若无处可以寄生,则输出0。

【约束条件】2≤K≤5 L≤N, 1≤L≤10 1≤N≤1000 -100≤a i≤100数据之间有一个空格。

【样【T2 】外星人的供给站外星人指的是地球以外的智慧生命。

外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识。

比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(C)的有机分子组合成的复杂有机体。

42岁的天文学家Dr. Kong已经执著地观测ZDM-777星球十多年了,这个被称为“战神”的红色星球让他如此着迷。

在过去的十多年中,他经常有一些令人激动的发现。

安徽省第六届安徽省大学生程序设计竞赛题目

安徽省第六届安徽省大学生程序设计竞赛题目

安徽省第六届安徽省大学生程序设计竞赛题目安徽省第六届大学生程序设计竞赛比赛题目安徽省高等学校计算机教育研究会安徽合肥2015.5.24A First BloodTime Limit: 3000/1000 MS (Java/Others)问题描述盖伦是个小学一年级的学生,在一次数学课的时候,老师给他们出了一个难题:老师给了一个正整数n,需要在不大于n的范围内选择三个正整数(可以是相同的),使它们三个的最小公倍数尽可能的大。

盖伦很想第一个解决这个问题,你能帮助盖伦拿到“first blood”吗?输入首先是一个正整数T,表示有T组测试数据每组测试数据是一个正整数n(1<=n<=10^6)输出对于每组测试数据,输出最大的最小公倍数,每个输出单独占一行样例输入297样例输出504210注意事项数据范围超出32位整数,可用long long或__int64表示64位整数B 求和Time Limit: 3000/1000 MS (Java/Others)问题描述对于正整数n,k ,我们定义这样一个函数f ,它满足如下规律...87654321)4,(...654321)3,(...654321)2,(...654321)1,(+++++----==++++---==+--++--==++-+-+-==k n f k n f k n f k n f现在给出n 和k ,你的任务就是要计算),(k n f 的值。

输入首先是一个整数T ,表示有T 组数据接下来每组数据是n 和k(810,1≤≤k n )输出打印出f (n , k )的值,每个输出单独占一行样例输入31 12 13 1样例输出-11-2C LU的困惑Time Limit: 3000/1000MS (Java/Others)问题描述Master Lu 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接俩个点,就会确定一条直线,对应有一个斜率。

第六届全国itat大赛C语言程序设计A

第六届全国itat大赛C语言程序设计A

第六届全国信息技术应用水平大赛复赛试题C语言程序设计(A 卷)请仔细阅读并严格遵守以下要求:请创建以“准考证号_用户名”命名的文件夹(形式如:433034683_xxxx),将考试结果 严格按试题上的要求进行命名并直接保存在该文件夹下。

注意:文件夹的保存路径请听从监考老师的安排。

请不要在该文件夹下创建任何子文 件夹,所有考试结果直接保存即可。

答卷完毕后,请将该文件夹用 Winrar 压缩工具打包,再通过《复赛考试结果上传系统》 将压缩包上传到指定服务器,并在原机器上保留备份。

注意:压缩打包时,请务必选中文件夹(如前面创建的“433034683_xxxx”文件夹) 进行压缩,而不是选中文件夹下的考试结果进行压缩。

请务必按照试卷要求提交指定的文件, 不得包含非题目要求的过程文件和临时文件, 不得包 含本试题文件和试题素材。

注意:凡违反上述规定的考生,其成绩一律按零分处理。

题目命名要求:请将编写好的源程序以题号命名,例如第 1题的源程序保存为“1.C”。

重要提示:由于时间有限,请考生首先保证编写的程序在 Wintc 环境下可以编译通过 并执行,在此基础上完成考题要求的全部功能,以免因编译不通过影响考生的考试成绩。

1. 编程解决如下问题(50 分)。

有一个数学等式:AB*CD=BA*DC,式中的一个字母代表一位数字,试找出所有符合上述 要求的乘积式并打印输出。

2. 编程解决如下问题(50 分)。

请在整数 n=742683613984 中删除 8 个数字, 使得余下的数字按原次序组成的新数最小。

要求如下:(1)整数 n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。

(提示:整数 n 可以以字符数组的方式定义、赋值和处理)3. 附加题:编程解决如下问题(50 分)。

(7,1)、(4,6)、(5,8) ,判断这三点组成的三角形是何种 (1)已知平面上三个点:三角形(锐角,直角,钝角)(10分);(2)对(1)问中的三角形,给出它的外接圆半径(20 分);(3)已知平面上 6 个点的坐标为:(7,1)、(4,6)、(5,8)、(6,2)、(3,9)、(2,7) , 试求覆盖这6 个点的覆盖圆最小半径(20 分)。

程序设计竞赛试题和题解

程序设计竞赛试题和题解

程序设计竞赛试题和题解付浩fuch@Contents完全平方数 (2)拉丁方阵 (3)取石子游戏 (5)乡村医院 (7)未知星球 (9)无聊的游戏 (10)最短路径 (12)完全平方数描述一个非负整数n是完全平方数当且仅当存在非负整数m,使得n=m2据说完全平方数具有某种神奇的力量,谁知道呢。

聪明的你一定想到了,这道题的任务就是编写一个程序,判断给定的n是否是完全平方数。

输入格式输入包含多组数据。

每组数据占一行,包含一个非负整数n,n不超过109输入以n=-1结束输出格式对每组输入数据输出一行,如果n是完全平方数则输出”Yes”,否则输出”No”输入样例1234-1输出样例YesYesNoNoYes解答一般的语言都有开平方运算吧?拉丁方阵描述拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中恰好出现一次。

著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。

例如下图是一个3×3的拉丁方阵:如果一个拉丁方阵的第一行和第一列按照元素的先后顺序来排列,那么这称为拉丁方阵的标准型,例如下图就是一个3x3的拉丁方阵标准型,第一行和第一列都是”1 2 3”。

你的任务是,编写一个程序读入一个方阵,判断其是否为拉丁方阵;进一步地,判断是否为标准型。

输入格式输入包含多组数据。

每组数据第一行为正整数n,表示方阵的大小。

其后n行,每行有n个1到n之间的整数,整数之间恰有一个空格,表示方阵的内容。

输入保证1≤n≤100输入以n=0结束,不要处理这个数据。

输出格式每组数据对应于一行输出。

如果输入是拉丁方阵,但不是标准型则输出1;如果输入是标准型则输出2;如果输入不是拉丁方阵则输出0输入样例21 12 233 2 12 1 31 3 231 2 33 2 12 1 254 35 2 15 4 1 3 21 52 4 32 13 5 43 24 15 31 2 32 3 13 1 2输出样例112解答按定义做判断。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、鸡兔同笼问题描述一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。

已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物输入数据第1行是测试数据的组数n,后面跟着n行输入。

每组测试数据占1行,包括一个正整数a (a < 32768)。

输出要求n行,每行输出对应一个输入。

输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。

如果没有满足要求的情况出现,则输出2个0。

输入样例2320输出样例0 05 10解题思路这个问题可以描述成任给一个整数N,如果N是奇数,输出0 0,否则如果N是4的倍数,输出N / 4 N / 2,如果N不是4的倍数,输出N/4+1 N/2。

这是一个一般的计算题,只要实现相应的判断和输出代码就可以了。

题目中说明了输入整数在一个比较小的范围内,所以只需要考虑整数运算就可以了。

参考程序1.#include <stdio.h>2.void main( )3.{4.int nCases, i, nFeet; //nCases 表示输入测试数据的组数,nFeet表示输入的脚数。

5.scanf("%d", &nCases);6.for(i = 0; i < nCases; i++){7.scanf("%d", &nFeet);8.if(nFeet %2 != 0) // 如果有奇数只脚,则输入不正确,9.// 因为不论2只还是4只,都是偶数10.printf("0 0\n");11.else if (nFeet%4 != 0) //若要动物数目最少,使动物尽量有4只脚12.//若要动物数目最多,使动物尽量有2只脚13.printf("%d %d\n", nFeet / 4 + 1, nFeet / 2);14.else printf("%d %d\n", nFeet / 4, nFeet / 2);15.}16.}二、判断闰年问题描述判断某年是否是闰年。

公历纪年法中,能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年,如1900年是平年,2000年是闰年。

输入数据一行,仅含一个整数a(0 < a < 3000)。

输出要求一行,如果公元a年是闰年输出Y,否则输出N。

输入样例2006输出样例N解题思路这个题目主要考察闰年的定义,使用基本的逻辑判断语句就可以了。

考虑到输入的范围在0到3000之间,所以判断闰年时不必考虑能被3200整除的年份不是闰年的判定条件。

程序应该包括三个基本的步骤:正确读入要判定的年份a;判定a是否为闰年;给出正确的输出。

其中,判断输入年份是否为闰年根据个人的思考习惯可以有不同的判定顺序。

参考解法一–分段排除:如果a % 4 ! = 0,则a不是闰年;否则如果a % 100 == 0 && a % 400 != 0,则a不是闰年;否则a是闰年。

参考解法二–列出所有闰年的可能条件,满足条件则为闰年,否则判为非闰年:如果(a % 400 == 0 || (a % 4 == 0 && a % 100 != 0)), 则a是闰年;否则a不是闰年。

参考程序一:1.#include <stdio.h>2.void main()3.{4.int a; //记录待判定的年份5.scanf("%d", &a);6.if(a % 4 != 0)7.printf("N\n");8.else if(a % 100 == 0 && a % 400 != 0)9.printf("N\n");10.else11.printf("Y\n");12.}参考程序二:1.#include <stdio.h>2.void main(){3.int a;4.scanf("%d", &a);5.if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)6.printf("Y\n");7.else8.printf("N\n");9.}三、细菌繁殖问题描述一种细菌的繁殖速度是每天成倍增长。

例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。

现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。

输入数据第一行有一个整数n,表示测试数据的数目。

其后n行每行有5个整数,整数之间用一个空格隔开。

第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。

已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。

数据保证要求的一天的细菌数目在整数范围内。

输出要求对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。

输入样例21 1 1 1 22 28 103 2输出样例240解题思路这题实际上是求给定的两天之间间隔的天数n,第一天的细菌数乘以2的n次方就是题目的答案。

每个月的天数因为不很规则,如果在程序中用规则描述会比较麻烦,所以可以使用一个数组将每个月的天数存起来。

整个计算过程可以描述如下:读入测试样例数n;做n次:1. 读入两个日期及第一天的细菌数;2. 将两个日期转换为当年的第几天;3.得到两个天数的差,即它们中间间隔的天数m;4.用第一天的细菌数乘以2的m次方等到x;5. 输出x;参考程序参考程序一:// 作者c0610002080131.#include <stdio.h>2.void main( )3.{4.int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};5.int n;6.int i;7.int sum;8.int k;9.long nNum;10.scanf("%d", &n);11.for(i = 0; i < n; i ++){12.int month_1, day_1, month_2, day_2, num; //起止日期的月份和日期。

13.scanf("%d%d%d%d%d", &month_1, &day_1, &num,&month_2, &day_2);14.sum = 0;15.for(k = month_1; k < month_2; k ++){16.sum += days[k - 1];17.}18.sum -= day_1;19.sum += day_2;20.21.nNum = num;22.for(k = 0; k < sum; k ++){23.nNum *= 2;24.}25.printf("%d\n", nNum);26.}27.}28.参考程序二:// 作者c0601005483021.#include<stdio.h>2.int month[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};3.void main()4.{5.int times;6.scanf("%d", &times);7.int mon1, date1, mon2, date2, num1;8.while(times --){9.scanf("%d%d%d%d%d", &mon1, &date1, &num1, &mon2, &date2);10.int days = date2 - date1;11.for(int i = mon1; i < mon2; i++){12.days += month[i];13.}14.long num = num1;15.for(int j = 0; j < days; j++){16.num *= 2;17.}18.printf( "%d\n", num );19.}20.}四、八皇后问题问题描述会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。

如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2 (8)其中b i为相应摆法中第i行皇后所处的列数。

已经知道8皇后问题一共有92组解(即92个不同的皇后串)。

给出一个数b,要求输出第b个串。

串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入数据第1行是测试数据的组数n,后面跟着n行输入。

每组测试数据占1行,包括一个正整数b(1 <= b <= 92)输出要求n行,每行输出对应一个输入。

输出应是一个正整数,是对应于b的皇后串输入样例2192输出样例1586372484136275解题思路一因为要求出92种不同摆放方法中的任意一种,所以我们不妨把92种不同的摆放方法一次性求出来,存放在一个数组里。

为求解这道题我们需要有一个矩阵仿真棋盘,每次试放一个棋子时只能放在尚未被控制的格子上,一旦放置了一个新棋子,就在它所能控制的所有位置上设置标记,如此下去把八个棋子放好。

当完成一种摆放时,就要尝试下一种。

若要按照字典序将可行的摆放方法记录下来,就要按照一定的顺序进行尝试。

也就是将第一个棋子按照从小到大的顺序尝试;对于第一个棋子的每一个位置,将第二个棋子从可行的位置从小到大的顺序尝试;在第一第二个棋子固定的情况下,将第三个棋子从可行的位置从小到大的顺序尝试;依次类推。

首先,我们有一个8*8的矩阵仿真棋盘标识当前已经摆放好的棋子所控制的区域。

用一个有92行每行8个元素的二维数组记录可行的摆放方法。

用一个递归程序来实现尝试摆放的过程。

基本思想是假设我们将第一个棋子摆好,并设置了它所控制的区域,则这个问题变成了一个7皇后问题,用与8皇后同样的方法可以获得问题的解。

那我们就把重心放在如何摆放一个皇后棋子上,摆放的基本步骤是:从第1到第8个位置,顺序地尝试将棋子放置在每一个未被控制的位置上,设置该棋子所控制的格子,将问题变为更小规模的问题向下递归,需要注意的是每次尝试一个新的未被控制的位置前,要将上一次尝试的位置所控制的格子复原。

相关文档
最新文档