标题2000.6请你编程
栏目软件世界
作者卜天明
发布2000年第25期
大家好!“请你编程”又与你们见面了。“请你编程”得到了广大朋友的关心和支持,我在这里表示衷心的感谢。“请你编程”是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看2000.4期重庆读者张周的程序。
本程序的基本思想是:先定义一个数组,该数组包含9个元素,每个元素都是一个结构,存放一个三角形的信息:a,b,c代表三角形三个顶点的序号,linenum代表三角形中已连线的数目,若该数目为3,则说明已组成了一个完整的三角形。程序开始时,首先按题意将每个三角形的序号填入结构数组的一个元素中,然后从输入文件中读取每个参赛者的每一次连线的两个序号,再在上述定义好的结构数组中查找,若发现该两个序号属于某一结构数组中的元素,则将该元素中的linenum加1,如果linenum为3,则表明该游戏者已找到了属于他的三角形,下一次仍由他玩,继续如此循环直到游戏结束。最后比较游戏双方找到三角形的数目,数目大者便为胜利者。
# include <stdio.h>
void main()
{/*定义一个结构,用于存放三角形的信息*/
typedef struct
{int a,b,c;/*分别存放三个顶点的序号*/
int linenum;/*存放该三角形已实际连起来的边的数目,若为3,则说明已组成了一个完整的三角形 */
} TriangleNode;
TriangleNode TriangleArray[9]; /* 结构数组,共有9个元素,其中每个元素表示一个三角形的信息*/
int ANum,BNum,times,i,j,k,n,m,x,y,StepFlag,FindFlag;
/* ANum,BNum 分别存放两个游戏者已找出的属于自己的三角形的个数 */
FILE *fp;
fp=fopen("method.txt","rb");
if (!fp)
{ printf("Can not open the file: method.txt!");
exit(1);}
/*装入每个三角形的顶点的序号到结构数组中*/
TriangleArray[0].a=1; TriangleArray[0].b=2; TriangleArray[0].c=3;
TriangleArray[1].a=2; TriangleArray[1].b=4; TriangleArray[1].c=5;
TriangleArray[2].a=2; TriangleArray[2].b=3; TriangleArray[2].c=5;
TriangleArray[3].a=3; TriangleArray[3].b=5; TriangleArray[3].c=6;
TriangleArray[4].a=4; TriangleArray[4].b=7; TriangleArray[4].c=8;
TriangleArray[5].a=4; TriangleArray[5].b=5; TriangleArray[5].c=8;
TriangleArray[6].a=5; TriangleArray[6].b=8; TriangleArray[6].c=9;
TriangleArray[7].a=5; TriangleArray[7].b=6; TriangleArray[7].c=9;
TriangleArray[8].a=6; TriangleArray[8].b=9; TriangleArray[8].c=10;
fscanf(fp,"%d",×); /*读入总共玩游戏的次数*/
for (i=0; i<times; ++i)
{for (j=0; j<9; ++j) TriangleArray[j].linenum=0; /* 每次游戏开始时,初始每个三角形结构中的linenum为0 */
ANum=BNum=0;
StepFlag=0; /*玩家标志。0 表示下一步由A走,1 表示由B走。按题意,每次开始时都是由A走 */
fscanf(fp,"%d",&m); /* 读入该次游戏中的回合数 */
for (j=0; j<m; ++j)
{FindFlag=0; /*每个回合中是否找到一个或多个三角形的标志,0表示没找到,1表示找到。每个回合开始时总清为0 */
fscanf(fp,"%d %d",&x,&y); /* 读入玩家连线的两个顶点,按题意,假设输入的点都是符合要求的:即不重复输入且都是有效的边的顶点 */
for (k=0; k<9; ++k) /*在9个三角形结构信息中扫描,看这两个顶点属于哪个三角形的*/
{ if ((TriangleArray[k].a==x && TriangleArray[k].b==y) ||
(TriangleArray[k].a==y && TriangleArray[k].b==x) ||
(TriangleArray[k].a==x && TriangleArray[k].c==y) ||
(TriangleArray[k].a==y && TriangleArray[k].c==x) ||
(TriangleArray[k].b==x && TriangleArray[k].c==y) ||
(TriangleArray[k].b==y && TriangleArray[k].c==x))
{++TriangleArray[k].linenum; /*把相应的三角形结构中的linenum加1,表示该三角形中又连好了一条线 */
if (TriangleArray[k].linenum==3) /* 若linenum为3,则表明出现了一个完整的三角形 */
{ FindFlag=1; /* 把找到标志置为1 */
if (StepFlag==0) ++ANum; /* 如该步是A走的,则该三角形属于A */
else ++BNum; /* 否则属于B */ }}}
/* 若FindFlag为1,则表明某玩家在该次连线中出现了完整的三角形,下一步仍由他走,否则由另一玩家走 */
if (FindFlag==1) StepFlag=StepFlag==0? 0:1;
else StepFlag=StepFlag==0?1:0;}
/*打印出该回合每个玩家找到的三角形的个数,并比较,个数多者便为胜利者,若相等,则两个都是胜利者 */
printf("Beacuse A is %d,B is %d,\n",ANum,BNum); if (ANum>BNum) printf("Game %d: A wins.\n\n",i+1);
else if (ANum<BNum) printf("Game %d: B wins.\n\n",i+1);
else printf("Game %d: A & B all wins.\n\n",i+1);} fclose(fp);}
本期请你编程题目
美食家俱乐部
美食家俱乐部有16位成员。他们将在同一家餐馆内连续吃五顿晚餐。他们被分成4桌,每桌4人。他们同时规定:在这五个晚上,曾经在同一桌吃过饭的人,以后不能再在同一桌上吃饭。Maitre负责安排这五天的座位。不幸的是,在第四天的早晨,Maitre失踪了。他只留下了前三天晚上座位安排的记录。现在,请你来完成他的工作。
输入:输入文件为“gourmet.txt”,每一位俱乐部成员由大写字母A,B,C,...,P来代替。每一批数据由三行组成,每一行分成4块(用空格来区分),每一块由4个字母组成,表示该天这桌的安排。每一批数据用空行来区分。
输出:如果能够成功安排最后两天的座位,则按照输入的格式将五天的座位安排全部输出;否则,输出“It is not possible to complete this schedule.”每一批数据的输出用一个空行来区分。
例如:
输入:
ABCD EFGH IJKL MNOP
AEIM BFJN CGKO DHLP
AFKP BGLM CHIN DEJO
输出:
It is not possible to complete this schedule.
本期题目由上海的卜天明提供。