2000.4请你编程 卜天明 2000年 第14期   大家好!《请你编程》又与你们见面了。《请你编程》得到了广大朋友的关心和支持,我在这里表示衷心的感谢。《请你编程》是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看上期(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;ia[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;jk)    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.