2000.4请你编程

Author: 卜天明 Date: 2000年 第14期

  大家好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看上期(9912)磐安读者马拥军的程序。
  本人用Turbo c 2.0编程实现了题目的要求。其思路如下:由题目可知,若现在出站的列车编号为x,则下一出站列车的编号y只有以下二种可能:一种可能y比x大;另一种可能y比x小,且y为已进站而未出站列车中编号最大者。源程序如下:
  #include<stdio.h>
  #define  MAX 1000
  int a[MAX];/*定义一个数组用于存放列车的出站顺序*/
  main()
  {int c,i;
  int fu();/*判断是否为已进站而未出站列车中编号最大者的函数*/
  FILE *fp;
  if((fp=fopen(″rails.txt″,″r″))==NULL)
    {printf(″can not open rails.txt!\n″);
    exit(1);}
  fscanf(fp,″%d″,&c);/*读入列车数*/
  while(c!=0)  /*若列车数不为0,则进入循环*/
   {fscanf(fp,″%d″,&a[0]);/*读入第一个数*/
   while(a[0]!=0) /*若第一个数为0,则表示这一组已结束,否则进入循环*/
     { for(i=1;i<c;i++)
           fscanf(fp,″%d″,&a[i]);/*循环读取c-1个数*/
       for(i=1;i<c;i++)  /*对出站序列进行检查*/
          if(a[i]>a[i-1]) ;/*若出站列车编号比上一出站列车编号大,则继续检查*/
        else
           if(!fu(i,c))  /*若比上一出站列车编号小,则调用函数检查是否为*/
              {printf(″NO\n″);  /*已进站而未出站列车中编号最大者,若是则*/
               break;}  /*继续检查,否则打印NO并退出检查*/
       if(i==c)  /*若最后检查都符合要求,则打印YES*/
        printf(″YES\n″);
       fscanf(fp,″%d″,&a[0]);  /*读入第一个数*/}
    printf(″\n″);
    fscanf(fp,″%d″,&c); /*读入列车数*/}}
  int fu(int i,int c) /*检查是否为已进站而未出站列车中编号最大者的函数*/
  {int j,k;
  k=a[i];
  for(j=i;j<c;j++)
    if(a[j]<a[i-1])
        if(a[j]>k)
        k=a[j];
  if(a[i]==k)
    return(1);
  else
    return(0);}
本期请你编程题目
  三角战争
  “三角战争”是在三角格子中玩的两人游戏(^14020401a^1)。
  有两个玩家A 和 B,从 A 开始,轮流在相邻的两个点之间连线。当一个玩家连了一根线之后出现了一个或多个三角形,那么他就拥有了这些三角形,而且,下一回仍然是由他来连线。例如,如果A 在2和5之间连了一根线,那么,他就拥有了由2、4、5所构成的标记为 A 的三角形(^14020401b^2)。然后,还是由他继续连线。他在3和5之间连线。然后,B 在2、3之间连线,他就获得了由2、3、5所构成的三角形。接下来,还是 B 连。他又在5、6之间连线,这样,他又获得了一个三角形,再连6、9,又获得了一个三角形……
  如所有点之间都已连线(共18条线),游戏结束,在总共9个三角形中,获得三角形最多的玩家胜利。我们规定每一次游戏都是由A 开始。
  程序要求:
  输入:文本文件method.txt,该文件中第一行是一个整数,说明总共玩游戏的次数。每一次游戏先用一个整数 m (6 <= m <= 18 ) 来说明已经玩了m个回合。接下来的 m 行描述了两个玩家前 m 回合的连法,每一行用i和 j 来表示连接的两点(i < j)。如:
  2
  6
  2 4
  4 5
  5 9
  3 6
  2 5
  3 5
  7
  2 4
  4 5
  5 9
  3 6
  2 5
  3 5
  7 8
  输出:你应该假设每一个玩家都努力使自己赢得游戏,即不会出现“假球”。对每一次游戏,若A胜,则输出″A wins.″,反之,输出″B wins.″。如对上例,程序输出为:
  Game 1: B wins.
  Game 2: A wins.