2000.6请你编程

Author: 卜天明 Date: 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″,&times); /*读入总共玩游戏的次数*/
  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.
  本期题目由上海的卜天明提供。