有意思的程序设计题目

来源:互联网 发布:linux关闭程序命令 编辑:程序博客网 时间:2024/04/28 07:08
 

俄罗斯方块

俄罗斯游戏中共有七种方块,每种方块都由四个方格组成,如下图所示,七种方块分别编号为1~7

游戏中,每次落下一个方块,落到一个宽度为10格的槽中。方块的下部一旦碰到槽的底部,或槽中已有的方块,就不能再移动。方块落下不动后,如果有某些行因落下的方块而填满,这些行将被消去。方块下落前,你可以控制方块的左右移动和旋转,以将其放在合适的位置。你对方块的所有移动和旋转操作在下落前(槽外)就计算完毕,然后直接下落到底,下落过程中不能再做操作。如果方块刚刚落下后顶部高度大于17行,游戏结束--即使此时有些行可以消除。

交互方式
你的程序应当包含tetris_lib.h,并连接相应的库文件。库中的两个重要函数是:
void StartGame(int* t1, int* t2);
int Step(int r, int l, int* next);

你的程序应该首先调用StartGame,其中t1t2表示前两个方块的编号(t2对应于传统游戏中的"下一个方块")。接下来,你的程序每次可以使用Step函数下落一个方块,返回消去的行数。r表示旋转方式(r=0, 1, 2, 3分别表示顺时针旋转0度、90度、180度、270度),l表示方块在旋转后的最左边一格的列编号(从左到右依次为1, 2, …, 10),而next表示方块落下后新的下一个方块编号(0代表没有下一个方块,下一次Step调用后库将自动终止你的程序)。你的程序不应自行终止。

关于自测的提示
调用StartGame函数时,库将从标准输入中读入若干行,每行包括一个整数,表示方块的编号。你可以利用这一点对你的程序进行测试。程序运行结束后,测试库将把结束原因和得分显示在标准输出中。

库中还有两个函数可以用于自测:
void SetLog(const char* filename);
void Snapshot();

如果需要测试库记录程序的行为,请在调用StartGame之前调用SetLog函数。

评分规则
在与测试库交互的过程中,出现以下条件之一,则库将终止程序:
1
、调用参数非法
2
、方块刚刚落下后,其顶部高度大于17
3
、所有方块均已落下
4
、本数据的运行总时间超过1秒钟

程序终止后,假设一次消去1行、2行、3行、4行的次数分别为a, b, c, d,则该数据原始得分为2b+6c+10d。换句话说,消去单独的1行不得分。

对于每个数据,得分排名前八的程序分别得到10, 7, 6, 5, 4, 3, 2, 1分。如果原始得分相同,则消去行数多的排名在前;如果原始得分和消去行数都相同,则下落方块总数多的排名在前。如果三者都相同,则得分相同。消去行数为0的程序不得分,即使它排在前八。

最终成绩按照50个数据的总分从大到小排序,如果总分相同则按所有数据的原始得分之和排序;如果仍有相同,则按所有数据的消去的总行数排序;如果仍相同,则名次相同。

 

 

 

饭团的烦恼

“午餐饭团“是百度内部参与人数最多的民间组织。

同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。

参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。

但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。

饭团点菜的需求如下:

1.  经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近12元越好。

2.  菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。

3.  请紧记,百度饭团在各大餐馆享受8折优惠。

输入数据描述如下:

第一行包含三个整数NMK0<N<=160<M<=N0<K<=12),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。

紧接着N行,每行的格式如下:

菜名(长度不超过20个字符) 价格(原价,整数) 是否荤菜(1表示是,0表示否) 是否辛辣(1表示是,0表示否)

例:

水煮鱼 30  1  1

紧接着是a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。

输出数据:

对于每一测试数据,输出数据包含M+1行,前M行每行包含一个菜名(按菜名在原菜单的顺序排序)。第M+1行是人均消费,结果保留两位小数。

说明:

1.结果菜单的数目应该恰好为M,荤菜,素菜,辛辣,清淡菜的数目恰好为abcd。在满足这样的前提下,选择人均消费最接近12元的点菜方案。题目数据保证有且仅有一个解。

2.每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。

输入样例

3 2 2

水煮鱼 30  1  1

口水鸡 18 1 1

清炖豆腐 12 0 0

1 1 1 1

输出样例

口水鸡

清炖豆腐

12.00

时间要求:1S之内

题目描述

八方块移动游戏要求从一个含8个数字(用1-8表示)的方块以及一个空格方块(用0表示)的3x3矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换,直至达到所定义的目标状态。空格方块在中间位置时有上、下、左、右4个方向可移动,在四个角落上有2个方向可移动,在其他位置上有3个方向可移动。例如,假设一个3x3矩阵的初始状态为:
    8 0 3
    2 1 4
    7 6 5
目标状态为:
    1 2 3
    8 0 4
    7 6 5
则一个合法的移动路径为:
    8 0 3     8 1 3     8 1 3     0 1 3     1 0 3     1 2 3
    2 1 4 => 2 0 4 => 0 2 4 => 8 2 4 => 8 2 4 => 8 0 4
    7 6 5     7 6 5     7 6 5     7 6 5     7 6 5     7 6 5

另外,在所有可能的从初始状态到目标状态的移动路径中,步数最少的路径被称为最短路径;在上面的例子中,最短路径为5。如果不存在从初试状态到目标状态的任何路径,则称该组状态无解。

请设计有效的(细节请见评分规则)算法找到从八方块的某初试状态到某目标状态的所有可能路径中的最短路径,并用C/C++实现。

输入数据

程序需读入已被命名为start.txt的初始状态和已被命名为goal.txt的目标状态,这两个文件都由9个数字组成(0表示空格,1-8表示8个数字方块),每行3个数字,数字之间用空格隔开。

输出数据

如果输入数据有解,输出一个表示最短路径的非负的整数;如果输入数据无解,输出-1

自测用例

如果输入为:start.txtgoal.txt,则产生的输出应为:
5

又例,如果用
7 8 4
3 5 6
1 0 2
替换start.txt中的内容,则产生的输出应为:
21

评分规则

1)我们将首先使用和自测用例不同的10start.txt以及相同的goal.txt,每个测试用例的运行时间在一台Intel Xeon 2.80GHz 4 CPU/6G 内存的Linux机器上应不超过10秒(内存使用不限制),否则该用例不得分;

2)每个选手的总分(精确到小数点后6位)=10秒钟内能产生正确结果的测试用例数量x10+1/产生这些正确结果的测试用例的平均运行毫秒)

3)如果按此评分统计仍不能得出总决赛将决出的一、二、三等奖共计九名获奖者,我们将先设N=2,然后重复下述过程直至产生最高的9位得分:用随机生成的另外10个有解的start.txt再做测试,并对这10*N个测试用例用2)中公式重新计算总分,N++


追捕

四个小孩正在花园里玩追捕游戏。一个小孩扮演逃亡者,其余三个小孩做追捕者。花园是一块由NM列方格组成的草地,花园周围有木栏包围着,不能走出,花园里面还有一些障碍物不能够通过。游戏可以进行许多回合,每个回合分成两轮,第一轮追捕者可以进行追捕行动,第二轮逃亡者可以根据前一轮追捕者的行动开展逃亡旅程。在第一轮里,三个追捕者必须在三人中选择一个人向某个相邻的方格走一步,只有在三个人都没有可以走的相邻方格时,他们才允许选择停留在原地。在第二轮里,逃亡者也必须选择某个相邻的方格走一步,如果逃亡者没有任何可走的方格,那么逃亡者就被捕了。四个小孩都不允许走到有障碍物或其他人的方格上,也不能走出花园,因而,四个小孩总是会位于不同的方格上面。

这些小孩都是非常聪明的,三个追捕者也是团结一致的。追捕者如果有可以捉到逃亡者的方法,那么他们就一定不会错过。逃亡者如果有不被捕获的方法,那么他也不会犯错。除此之外,追捕者会希望尽快地捉到逃亡者,而逃亡者即使在会被捕获的情况下也会尽可能地拖延时间。给定花园的障碍物的分布图和四个小孩的初始位置,你知道追捕者有方法捉到逃亡者吗?如果有,他们要经过多少轮后才能捉到逃亡者呢?

输入格式:

输入文件包含多组测试数据。每组测试数据第一行为两个整数NM1N101M10,为花园方格阵列的行数和列数。接下来N行,每行M个字符,可以为“.”、“#”、“O”和“X”,分别表示空地、障碍物、追捕者和逃亡者。追捕者总是会有三个,而且四个小孩一开始也都会在空地上面。

输出格式:

每组测试数据输出一行,若追捕者能够捉到逃亡者,则输出他们要经过多少轮后才能成功。轮数的计算包括追捕者和逃亡者进行行动的两轮,逃亡者被捕获的那一轮不算,因而结果总是一个奇数。具体输出格式请参考输出样例。

输入样例:

2 2

OO

OX

3 3

OOO

##X

...

3 3

OO#

###

.OX

3 4

OO##

####

..OX

4 4

OOO.

....

....

...X

5 5

O...O

.....

..#..

.....

O...X

5 5

O...O

.....

...#.

.....

O...X

6 6

......

.O..O.

..##..

..##..

.O..X.

......

6 6

#.....

.O..O.

..##..

..##..

.O..X.

......

10 10

..........

..........

..O....O..

..........

..........

..........

..........

..O....X..

..........

..........

10 10

..........

.#.#.#.#.#

..O.....O.

.#.#.#.#.#

..........

.#.#.#.#.#

..........

.#.#.#.#.#

..O.....X.

.#.#.#.#.#

输出样例:

The escapee will be captured after 1 steps

The escapee will be captured after 7 steps

The escapee will be captured after 5 steps

The escapee will never be captured

The escapee will be captured after 21 steps

The escapee will never be captured

The escapee will be captured after 41 steps

The escapee will never be captured

The escapee will be captured after 39 steps

The escapee will never be captured

The escapee will be captured after 51 steps

说明:

共有5个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为510153040分,对每个测试数据集分别执行一次程序,每次必须在运行时限60秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 stdout/cout)中。

五个测试数据集中输入NM分别不大于678910

彩球游戏

X博士是一个研究儿童智力开发方法的科学家,他为幼儿教育领域做出了许多贡献。最近,X博士正在研究一种适合儿童的游戏,用以辅助发展儿童的观察力、注意力和思维能力。经过连日的构思,X博士终于设计出了一种游戏:彩球游戏。

彩球游戏是一种单人参与的游戏,游戏首先给出一串由许多不同颜色的小球组成的小球序列,以及一个整数参数MM2)。一段连续的具有相同颜色的小球序列称为连续同色序列。小孩,即游戏参与者,每次可以向任意一段连续同色序列插入一个同色小球,使该序列的长度加一。当一段连续同色序列在插入一个同色小球后其长度达到M时,该序列就会爆炸消失,然后原序列两边的其余小球会重新连成一串,如果两段相同颜色的连续同色序列在此时连接在一起,它们就会合并形成一段新的连续同色序列。如果新形成的连续同色序列长度达到M,这段序列也会爆炸消失,然后重复上述过程,直到没有新的长度达到M的连续同色序列出现为止。游戏的目标很简单,就是插入尽量少的小球,使得所有小球都爆炸消失掉。

通过长时间的游戏和不断提高游戏水平,这个游戏可以很好地开发儿童的观察力、注意力和思维能力。但是X博士仍然面临着一个困难的问题,他还需要设计出一个游戏演示AI程序,可以以最优的方式(即插入的小球数量最小)进行游戏,用于游戏教学,或者在游戏中对小孩给出提示。X博士并不擅长此类程序,因而他无法完成这个任务,你可以帮助他吗?

输入格式:

输入文件包含多组测试数据。每组测试数据第一行为整数M2M20),第二行为一条非空的字符串,由大写字母组成且长度不超过200,表示初始的一串小球,不同的字母表示不同的小球颜色。初始时可能会存在一些长度达到M的连续同色序列,但这些序列不会马上爆炸消失。

输出格式:

每组测试数据输出一行,表示至少需要插入多少次小球才能使所有小球爆炸消失掉。

输入样例:

3

AAABAAA

3

ABBABBA

输出样例:

2

2

说明:

共有5个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为510153040分,对每个测试数据集分别执行一次程序,每次必须在运行时限30秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 stdout/cout)中。

五个测试数据集中输入初始小球队列的长度分别不大于102050100200,各有不超过5000组测试数据。

星球大战

 

公元4999年,人类科学高度发达,绝大部分人都已经移居至浩瀚的宇宙,在上千颗可居住星球上留下了人类的印记。然而,此时人类却分裂成了两个联盟:正义联盟和邪恶联盟。两个联盟之间仇恨难解,时有战争。

现在,正义联盟计划要破坏邪恶联盟的贸易网络,从而影响邪恶联盟的经济状况,为下一次战争作好准备。邪恶联盟由数百颗星球组成,贸易通过星球间的运输航道来完成。一条运输航道是双向的且仅连接两个星球,但两个星球之间可以有多条航道,也可能没有。两个星球之间只要有运输航道直接或间接的相连,它们就可以进行贸易。正义联盟计划破坏邪恶联盟中的一些运输航道,使得邪恶联盟的星球分成两部分,任一部分的星球都不能与另一部分的星球进行贸易。但是为了节省破坏行动所需的开支,正义联盟希望破坏尽量少的运输航道来达成目标。请问正义联盟最少需要破坏多少条运输航道呢?

输入格式:

输入文件包含多组测试数据。每组测试数据第一行为两个整数NM2N5000MN(N-1)/2N为邪恶联盟中星球的数量。接下来M行,每行三个整数ABC0AB<NABC>0),表示星球A和星球B之间有C条运输航道。运输航道的总数量不超过108

输出格式:

每组测试数据输出一行,包含一个整数,表示需要破坏的运输航道的数量。

如果输入的贸易网络本来就是不连通的,则输出0

输入样例:

3 3

0 1 1

1 2 1

2 0 1

4 3

0 1 1

1 2 1

2 3 1

8 14

0 1 1

0 2 1

0 3 1

1 2 1

1 3 1

2 3 1

4 5 1

4 6 1

4 7 1

5 6 1

5 7 1

6 7 1

4 0 1

7 3 1

输出样例:

2

1

2

说明:

共有5个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为510153040分,对每个测试数据集分别执行一次程序,每次必须在运行时限10秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 stdout/cout)中。

五个测试数据集中输入N分别不大于2050100200500,各有9组测试数据。

空中飞猴

 

马戏团里新来了一只很特别的小猴子皮皮——不仅长得漂亮,还很聪明。自从它来到马戏团之后,“空中飞猴”成了马戏团里保留节目,慕名观看的人络绎不绝。“空中飞猴”表演开始时,空中架着两根长长的钢丝。皮皮在其中一根上,它的目标是到达另一个根钢丝上。皮皮必须在爬行一定距离后纵身一跃,直接跳到另一根钢丝的某个位置。由于皮皮的速度非常快,它的运动轨迹可以近似的看成一条直线段。为了不让自己太危险,皮皮希望自己的跳跃距离尽量短,而为了不让观众等得太不耐烦,它在钢丝上的爬行距离不能超过d。在爬行距离不超过d的情况下,皮皮的跳跃距离最短是多少?

输入格式:

输入文件包含多组测试数据。每组测试数据包含16个实数x1y1z1x2y2z2x3y3z3x4y4z4xpypzpd,表示两根钢丝分别为线段(x1,y1,z1)-(x2,y2,z2)(x3,y3,z3)-(x4,y4,z4),皮皮的坐标为(xp, yp, zp),最大爬行距离为d。皮皮保证在第一条钢丝上,保证每条钢丝长度大于零。但两条钢丝有可能相交甚至重叠。

输出格式:

每组测试数据输出一行,仅包含一个非负实数,四舍五入保留三位小数,即最短跳跃距离。

输入样例:

0.0 0.0 0.0 4.0 4.0 0.0 4.0 0.0 1.0 0.0 4.0 1.0 2.0 2.0 0.0 10.0

输出样例:

1.000

说明:

共有3个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为303040分,对每个测试数据集分别执行一次程序,每次必须在运行时限3秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 stdout/cout)中。

三个测试数据集各有10000组测试数据。

另类杀人游戏

周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从11匪到nn匪,他们尝试了几乎所有流行的杀人游戏规则。终于有一天,连最热衷杀人游戏,“杀人”不眨眼的Austin也开始对无休止的辩论感到厌烦。于是,他决定改变他的一贯作风,他开始变成了一个“杀人不睁眼”的杀手。

如何做到杀人不睁眼呢?Austin早已构思好他的杀人计划:

1.  N个人(包括Austin)坐成一圈玩杀人游戏,按顺时针编号1234。。。。。

2.  Austin1号开始顺时针开始数到第m号就杀掉第一个人。被杀掉的人要退出游戏。

3.  如果第m个人恰好是Austin自己,他就杀掉他顺时针方向的下一个人。

4.  Austin从被杀的人的下一个顺时针数m个人,把第m个杀掉。

5.  重复2-4,直至杀掉所有人。

Austin把这个杀人计谋告诉了法官小k,他便可以闭起眼睛杀人啦。作为一个正直善良的法官,小k当然不能让残忍的Austin得逞,于是,她偷偷把Austin的杀人计划告诉了作为警察的你,聪明的百度之星。现在,你的任务是活到最后,与Austin单挑。

输入:

第一个行包含一个整数T,表示有T组测试数据。

对于每组测试数据:

三个整数

NMT(3<=N<=10000,1<=M,T<=10000) 分别表示参与游戏的人数,Austin每隔M个人会杀掉一人,Austin初始位置的标号。

输出:

每个测数数据输出一个整数。

你需要选择的初始位置的序号,以确保最后剩下的两个人是你与Austin

输入例子:

2

7 4 1

7 4 1

输出例子

5

5

例子说明:杀人顺序为4 2 7 6 3 5 所以5 是你要选择的位置。

原创粉丝点击