--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <vector>
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+using namespace std;
+
+/**
+ * A suitably terrible program which combines C style IO with C++ style IO
+ * Enjoy!
+ * Mwuhahaha
+ */
+
+int main(int argc, char ** argv)
+{
+ setbuf(stdout, NULL);
+ setbuf(stdin, NULL);
+
+
+ //Read in the colour, and choose a layout
+
+ int width = 14; int height = 14;
+
+ string colour; string opponent;
+ cin >> colour; cin >> opponent; cin >> width; cin >> height;
+ fgetc(stdin);
+
+ //fprintf(stderr, "Colour is \"%s\", width and height are (%d, %d), opponent is \"%s\"\n", colour.c_str(), width, height, opponent.c_str());
+
+ assert(width == 10 && height == 10); //Can't deal with other sized boards
+ if (colour == "RED")
+ {
+ fprintf(stdout, "FBnyBmSsBn\n");
+ fprintf(stdout, "BBCMccccnC\n");
+ fprintf(stdout, "LSGmnsnsSm\n");
+ fprintf(stdout, "sLSBLLssss\n");
+ }
+ else if (colour == "BLUE")
+ {
+ fprintf(stdout, "sLSBLLssss\n");
+ fprintf(stdout, "LSGmnsnsSm\n");
+ fprintf(stdout, "BBCMccccnC\n");
+ fprintf(stdout, "FBnyBmSsBn\n");
+ }
+ else
+ {
+ return 1;
+ }
+
+
+
+ char board[width][height];
+
+ vector<pair<int, int> > choices;
+
+ int myPid = (int)(getpid());
+
+ while (true)
+ {
+ //fprintf(stderr, "%s [%d] looping\n", argv[0], myPid);
+ choices.clear();
+
+ //fprintf(stderr, "%s Waiting for status line...\n", colour.c_str());
+ char c = fgetc(stdin);
+ while (c != '\n')
+ {
+ //fprintf(stderr,"%c",c);
+ c = fgetc(stdin);
+ }
+ //fprintf(stderr, "%s Got status, waiting for board line...\n", colour.c_str());
+
+ //Read in board
+ for (int y=0; y < height; ++y)
+ {
+ for (int x=0; x < width; ++x)
+ {
+ board[x][y] = fgetc(stdin);
+ if (board[x][y] == EOF)
+ exit(EXIT_SUCCESS);
+
+ if (board[x][y] != '.' && board[x][y] != '*' && board[x][y] != '#' && board[x][y] != '+')
+ {
+ choices.push_back(pair<int, int>(x, y));
+ }
+ }
+ assert(fgetc(stdin) == '\n');
+ }
+
+
+
+ int dir = 0; int startDir = 0; int choice = rand() % choices.size(); int startChoice = choice;
+ int x1 = 0; int y1 = 0;
+ do
+ {
+
+
+ pair<int,int> pear = choices[choice];
+ x1 = pear.first;
+ y1 = pear.second;
+ //fprintf(stderr,"Trying unit at %d %d...\n", x1, y1);
+
+ if (board[x1][y1] == 'B' || board[x1][y1] == 'F')
+ {
+ choice = (choice+1) % choices.size();
+ continue;
+ }
+
+ int x2 = x1;
+ int y2 = y1;
+ dir = rand() % 4; startDir = dir; int lastDir = dir;
+
+ bool okay = false;
+ while (!okay)
+ {
+ //fprintf(stderr," Trying direction %d...\n", dir);
+ x2 = x1; y2 = y1;
+ switch (dir)
+ {
+ case 0:
+ --y2;
+ break;
+ case 1:
+ ++y2;
+ break;
+ case 2:
+ --x2;
+ break;
+ case 3:
+ ++x2;
+ break;
+ }
+
+ okay = !(x2 < 0 || y2 < 0 || x2 >= width || y2 >= height || (board[x2][y2] != '.' && board[x2][y2] != '*' && board[x2][y2] != '#'));
+ if (!okay)
+ {
+ dir = (dir+1) % 4;
+ if (dir == startDir)
+ break;
+ }
+
+ }
+
+
+
+ choice = (choice+1) % choices.size();
+ if (dir != startDir)
+ break;
+ }
+ while (choice != startChoice);
+
+
+ string direction="";
+ switch (dir)
+ {
+ case 0:
+ direction = "UP";
+ break;
+ case 1:
+ direction = "DOWN";
+ break;
+ case 2:
+ direction = "LEFT";
+ break;
+ case 3:
+ direction = "RIGHT";
+ break;
+ }
+ printf("%d %d %s\n", x1, y1, direction.c_str());
+ //fprintf(stderr,"%s Made move, waiting for confirmation line\n", colour.c_str());
+ while (fgetc(stdin) != '\n'); //Read in result line
+ //fprintf(stderr, "%s Done turn\n", colour.c_str());
+ //fprintf(stderr,"%s - %d %d %s\n",colour.c_str(), x1, y1, direction.c_str() );
+ //fprintf(stderr, "%s [%d] computed move\n", argv[0], myPid);
+ }
+}