|
当前位置:电脑报电子版 > 1999 年 > 17 期 > 软件世界 > 9904请你编程 |
《 9904请你编程 》 |
朋友们,大家好!《请你编程》又与你们见面了。本期参与的读者朋友非常多,基本上都能找到程序的编程思路并得出正确答案。但有些朋友在来稿中只写了详细地址和邮编,而没有署名,请这些朋友在以后参与时不要忘记署名。希望朋友们继续保持投稿的热情,关心和支持《请你编程》栏目。现在,请看四川读者何苦的答案。 9904请你编程解题思路 1.数字1放在第一行的中间一列; 2.从数字2到(n×n)各数,每一个数字存放的行是前一个数的行数减1,列数加1; 3.如果上一数的行数等于1,则下一个数的行数为n; 4.如果上一数的列数等于n,则下一数的列数等于1,行数等于上一数的行数减1; 5.如按上面规则确定的位置上已经有数时,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。 源程序 main( ) {int n,i,j,k,x,y; static int t[16][16]; loop: printf(″input (0 if ((n%2==0)||(n<0)||(n>15)) {printf(″this n is not use\n″; goto loop;} /*如果n值不满足,则继续输入*/ else {j=1; k=(n+1)/2; t[j][k]=1; /*第一种情况*/ x=j; y=k; for(i=2;i<(n*n+1);i++) { j=j-1; /*第二种情况*/ k=k+1; if((j<1)&&(k>n)) {j=j+2; k=k-1;} else {if (k>n) k=1; /*第四种情况*/ else if (j<1) j=n;} /*第三种情况*/ if (t[j][k]==0) t[j][k]=i; /*第五种情况*/ else {j=x+1; k=y; t[j][k]=i;} x=j; y=k; }} for(j=1;j<(n+1);j++) /*打印n×n矩阵*/ for(k=1;k<(n+1);k++) {printf(″%4d″,t[j][k]); if (k==n) printf(″\n″);}} 9906请你编程题目 大家都看过大回转的滑雪比赛,选手在从山上滑下来的时候,要绕过一些旗子。现在也要举行一场大回转的滑雪比赛,但规则有些不一样: 1.赛会提供若干面旗子,每一面旗子上都标有一个正整数,作为旗子的编号。这个编号纯粹是一个随机数,既不一定唯一也不一定连续。这些旗子插在选手从山上滑下来的路上。 2.选手在下滑的过程中,可以自由选择是否要绕过某些旗子。但是,如果选手绕过了一面旗子,该旗子的编号为N,下次他就不能绕过所有编号小于N的旗子。例如:如果选手绕过了编号为10的旗子,他就不能再绕过所有编号为1到10的旗子。 3.在从山上滑下来的选手中,绕过的旗子的数目最多的人获胜。(可以并列) 现在,请你编一个程序,帮选手算一下要绕过多少面旗子才可保证获胜。 程序要求如下: 数据从文本文件skate.txt中读出,格式如下: 1.第一行为一个整数N,表示以下有N组输入数据,其中N<=10。 2.每组输入数据格式为:第一行为一个整数M,表示该组数据中有M面旗子。第二行包括M个整数,整数间用空格分开,表示从上到下的M面旗子的编号。其中1<=M<=30000,1<=旗子编号<=65535。 输出到屏幕,输出共为N行。每行包括一个整数K,表示选手要绕过K面旗子才可保证获胜。 输入范例: 1 6 4 3 3 4 5 1 输出范例: 3 欢迎提供支持超大规模数据的程序,M可达到3,000,000,旗子编号可达6,000,000。本期题目由上海的Oldbug提供。 来稿请寄磁盘稿或用E-mail投稿,请写明解题思路和源程序(包含详细的注解),将来稿寄到电脑报编辑部的收信地址或E-mail邮箱,同时欢迎提供请你编程的题目。来稿截止日期:1999年6月15日 本期获奖者名单 张东晓(湖南) 徐 波(重庆) 韦岳阳(广西) 王正谋(广东) 刘 军(江西) 杜重德(浙江) 车生兵(湖南) 李 阳(新疆) 廖 恒(山西) 胡立军(黑龙江) 每位获奖者将获得苦丁香公司提供的光盘一张。 |
下载本期推荐软件 | 页 首 |
《电脑报》版权所有,电脑报网站编辑部设计制作发布 |