2000.4请你编程
本人用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.