#include #include #include #include "chess_paths.h" struct chessboard { unsigned int C; unsigned int R; int board[]; }; int value_at(const struct chessboard * this, unsigned column, unsigned row) { row = this->R - row - 1; return this->board[row*this->C + column]; } unsigned int columns(const struct chessboard * this) { return this->C; } unsigned int rows(const struct chessboard * this) { return this->R; } struct chessboard * new_board(unsigned int cols, unsigned int rows) { struct chessboard * this = malloc(sizeof(struct chessboard) + sizeof(int)*cols*rows); if (this) { this->C = cols; this->R = rows; } return this; } int read_board(struct chessboard * this, FILE * input) { for (unsigned int i = 0; i < this->C * this->R; ++i) if (fscanf(input, "%d", this->board + i) != 1) return 0; return 1; } enum chess_piece char_to_piece(char piece) { switch (piece) { case 'P': case 'p': return PAWN; case 'N': case 'n': return KNIGHT; case 'B': case 'b': return BISHOP; case 'R': case 'r': return ROOK; case 'Q': case 'q': return QUEEN; case 'K': case 'k': return KING; default: return PAWN; } } int main() { unsigned int r, c; assert (scanf("%u%u", &c, &r) == 2); struct chessboard * board = new_board (c, r); assert (board); assert (read_board(board, stdin)); char piece[2]; char path_type[2]; struct piece_position p; while (scanf("%1s%1s%u%u", path_type, piece, &c, &r) == 4) { unsigned int len; p.column = c; p.row = r; p.piece = char_to_piece(*piece); switch (*path_type) { case 'i': case 'I': len = increasing_path_len(board, &p); break; case 'd': case 'D': len = decreasing_path_len(board, &p); break; case 's': case 'S': len = simple_path_len(board, &p); break; } printf("%s (%u,%u) --> (%u,%u) in %u steps\n", piece, c, r, p.column, p.row, len); } }