2000.4请你编程

大家好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看上期(9912)磐安读者马拥军的程序。
  本人用Turbo c 2.0编程实现了题目的要求。其思路如下:由题目可知,若现在出站的列车编号为x,则下一出站列车的编号y只有以下二种可能:一种可能y比x大;另一种可能y比x小,且y为已进站而未出站列车中编号最大者。源程序如下:
  #include
  #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    fscanf(fp,″%d″,&a[i]);/*循环读取c-1个数*/
   for(i=1;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    if(a[j]    if(a[j]>k)
   k=a[j];
  if(a[i]==k)
   return(1);
  else
   return(0);}
本期请你编程题目
  三角战争
  “三角战争”是在三角格子中玩的两人游戏((图1)1)。

图1
图1

  有两个玩家A 和 B,从 A 开始,轮流在相邻的两个点之间连线。当一个玩家连了一根线之后出现了一个或多个三角形,那么他就拥有了这些三角形,而且,下一回仍然是由他来连线。例如,如果A 在2和5之间连了一根线,那么,他就拥有了由2、4、5所构成的标记为 A 的三角形((图2)2)。然后,还是由他继续连线。他在3和5之间连线。然后,B 在2、3之间连线,他就获得了由2、3、5所构成的三角形。接下来,还是 B 连。他又在5、6之间连线,这样,他又获得了一个三角形,再连6、9,又获得了一个三角形……
图2
图2

  如所有点之间都已连线(共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.