D :: Pousse
Time Limit: 1 Second Memory Limit: 32768 KB
Recently, the organizers of the International Conference on Functional Programming had a programming contest for people to show that their language was best. The contest main web page is at http://www.ai.mit.edu/extra/icfp-contest/. Each entrant had to write an implementation of the game "pouse", for which the description went as follows:
Description of the game
The name of the game is "pousse" (which is French for "push").
It is a 2 person game, played on an N by N board (the original game was 4x4
but NxN is a simple generalisation to adjust the difficulty of the game, and
its implementation). Initially the board is empty, and the players take turns
inserting one marker of their color (X or O) on the board. The color X always
goes first. The columns and rows are numbered from 1 to N, starting from the
top left, as in:
1 2 3 4
+-+-+-+-+
1 | | | | |
+-+-+-+-+
2 | | | | |
+-+-+-+-+
3 | | | | |
+-+-+-+-+
4 | | | | |
+-+-+-+-+
A marker can only be inserted on the board by sliding it onto a particular
row from the left or from the right, or onto a particular column from the top
or from the bottom. So there are 4*N possible "moves" (ways to insert
a marker). They will be named "Li", "Ri", "Ti",
"Bi" respectively, where "i" is the number of the row or
column where the insertion takes place.
When a marker is inserted, there may be a marker on the square where the insertion
takes place. In this case, all markers on the insertion row or column from the
insertion square upto the first empty square are moved one square further to
make room for the inserted marker. Note that the last marker of the row or column
will be pushed off the board (and must be removed from play) if there are no
empty squares on the insertion row or column.
A row or a column is a "straight" of a given color, if it contains N markers of the given color.
The game ends when an insertion creates a configuration with more straights of one color than straights of the other color; the player whose color is dominant (in number of straights) WINS.
Input
The standard input of the program will contain a number N <= 100 on the first
line and this will be followed by a sequence of moves (in the notation previously
described) with one move per line. There are no intervening spaces or empty
lines.
The program can assume that all moves in the sequence are valid.
Process to the end of file.
Output
The organizers then want to play one submitted program against the others to
see which is best. So they need to know when one program wins.
Your job is to write a program to determine when a game has been won. The input
to your program is the same as described above: an initial number followed by
a sequence of moves. As soon as a move produces a winning board position, your
program should print out whether "X WINS" or "O WINS", and
exit. If a line containing QUIT is read before a winner is declared, your program
should print out "TIE GAME" and exit. As a failsafe, the last line
of every input will be a QUIT line.
Sample Input
4 L2 T2 L2 B2 R2 QUIT 4 L2 T2 L2 B2 R2 T1 L2 QUIT
Sample Output
TIE GAME X WINSSubmit
Source: University of Waterloo Local Contest 1998.10.04