#include <iostream>
#include <string>
#include <utility>
#include <cctype>
using namespace std;
constexpr int brdsze = 8 ; //Size of board
//Validate input and convert to co-ordinates
//Returns true if OK and false if problem
bool inpval( const string& inp, pair< int , int > & coord)
{
return ( inp.size ( ) == 2 ) && ( ( coord.first = toupper ( inp[ 0 ] ) - 'A' ) >= 0 ) && ( coord.first < brdsze) && ( ( coord.second = inp[ 1 ] - '1' ) >= 0 ) && ( coord.second < brdsze) ;
}
int main( )
{
//Offsets for knights possible moves - determines order of display
constexpr int kgtpos = 8 ;
constexpr pair< int , int > kgtmov[ kgtpos] = { { - 2 , - 1 } , { - 2 , 1 } , { - 1 , - 2 } , { - 1 , 2 } , { 1 , - 2 } , { 1 , 2 } , { 2 , - 1 } , { 2 , 1 } } ;
string inp;
pair< int , int > pos;
//Get and validate starting position
do {
cout << "Enter starting position: " ;
getline( cin , inp) ;
} while ( ! inpval( inp, pos) && ( cout << "\n Invalid starting position.\n Input format is CR where\n C is A to " << ( char ) ( 'A' + brdsze - 1 ) << "\n R is 1 to " << brdsze << endl) ) ;
//Find last valid position
int last = kgtpos - 1 ;
for ( int got = false , rw, cl; ! got; -- last)
got = ( ( cl = pos.first + kgtmov[ last] .first ) >= 0 ) && ( cl < brdsze) && ( ( rw = pos.second + kgtmov[ last] .second ) >= 0 ) && ( rw < brdsze) ;
cout << "\n Available positions from " << inp << " are" << endl;
//Find positions from first up to found last position and output in required format
for ( int pst = 0 , first = 0 , lst = last + 1 , rw, cl; pst <= lst; ++ pst)
if ( ( ( cl = pos.first + kgtmov[ pst] .first ) >= 0 ) && ( cl < brdsze) && ( ( rw = pos.second + kgtmov[ pst] .second ) >= 0 ) && ( rw < brdsze) )
cout << ( first++ ? ( ( pst == lst) ? ", and " : ", " ) : "" ) << char ( cl + 'A' ) << rw + 1 ;
cout << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGNjdHlwZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0ZXhwciBpbnQgYnJkc3plID0gODsJLy9TaXplIG9mIGJvYXJkCgovL1ZhbGlkYXRlIGlucHV0IGFuZCBjb252ZXJ0IHRvIGNvLW9yZGluYXRlcwovL1JldHVybnMgdHJ1ZSBpZiBPSyBhbmQgZmFsc2UgaWYgcHJvYmxlbQpib29sIGlucHZhbChjb25zdCBzdHJpbmcmIGlucCwgcGFpcjxpbnQsIGludD4mIGNvb3JkKQp7CglyZXR1cm4gKGlucC5zaXplKCkgPT0gMikgJiYgKChjb29yZC5maXJzdCA9IHRvdXBwZXIoaW5wWzBdKSAtICdBJykgPj0gMCkgJiYgKGNvb3JkLmZpcnN0IDwgYnJkc3plKSAmJiAoKGNvb3JkLnNlY29uZCA9IGlucFsxXSAtICcxJykgPj0gMCkgJiYgKGNvb3JkLnNlY29uZCA8IGJyZHN6ZSk7Cn0KCmludCBtYWluKCkKewoJLy9PZmZzZXRzIGZvciBrbmlnaHRzIHBvc3NpYmxlIG1vdmVzIC0gZGV0ZXJtaW5lcyBvcmRlciBvZiBkaXNwbGF5Cgljb25zdGV4cHIgaW50IGtndHBvcyA9IDg7Cgljb25zdGV4cHIgcGFpcjxpbnQsIGludD4ga2d0bW92W2tndHBvc10gPSB7IHstMiwgLTF9LCB7LTIsIDF9LCB7LTEsIC0yfSwgey0xLCAyfSwgezEsIC0yfSwgezEsIDJ9LCB7MiwgLTF9LCB7MiwgMX0gfTsKCglzdHJpbmcgaW5wOwoJcGFpcjxpbnQsIGludD4gcG9zOwoKCS8vR2V0IGFuZCB2YWxpZGF0ZSBzdGFydGluZyBwb3NpdGlvbgoJZG8gewoJCWNvdXQgPDwgIkVudGVyIHN0YXJ0aW5nIHBvc2l0aW9uOiAiOwoJCWdldGxpbmUoY2luLCBpbnApOwoJfSB3aGlsZSAoIWlucHZhbChpbnAsIHBvcykgJiYgKGNvdXQgPDwgIlxuSW52YWxpZCBzdGFydGluZyBwb3NpdGlvbi5cbklucHV0IGZvcm1hdCBpcyBDUiB3aGVyZVxuQyBpcyBBIHRvICIgPDwgKGNoYXIpKCdBJyArIGJyZHN6ZSAtIDEpIDw8ICJcblIgaXMgMSB0byAiIDw8IGJyZHN6ZSA8PCBlbmRsKSk7CgoJLy9GaW5kIGxhc3QgdmFsaWQgcG9zaXRpb24KCWludCBsYXN0ID0ga2d0cG9zIC0gMTsKCglmb3IgKGludCBnb3QgPSBmYWxzZSwgcncsIGNsOyAhZ290OyAtLWxhc3QpCgkJZ290ID0gKChjbCA9IHBvcy5maXJzdCArIGtndG1vdltsYXN0XS5maXJzdCkgPj0gMCkgJiYgKGNsIDwgYnJkc3plKSAmJiAoKHJ3ID0gcG9zLnNlY29uZCArIGtndG1vdltsYXN0XS5zZWNvbmQpID49IDApICYmIChydyA8IGJyZHN6ZSk7CgoJY291dCA8PCAiXG5BdmFpbGFibGUgcG9zaXRpb25zIGZyb20gIiA8PCBpbnAgPDwgIiBhcmUiIDw8IGVuZGw7CgoJLy9GaW5kIHBvc2l0aW9ucyBmcm9tIGZpcnN0IHVwIHRvIGZvdW5kIGxhc3QgcG9zaXRpb24gYW5kIG91dHB1dCBpbiByZXF1aXJlZCBmb3JtYXQKCWZvciAoaW50IHBzdCA9IDAsIGZpcnN0ID0gMCwgbHN0ID0gbGFzdCArIDEsIHJ3LCBjbDsgcHN0IDw9IGxzdDsgKytwc3QpCgkJaWYgKCgoY2wgPSBwb3MuZmlyc3QgKyBrZ3Rtb3ZbcHN0XS5maXJzdCkgPj0gMCkgJiYgKGNsIDwgYnJkc3plKSAmJiAoKHJ3ID0gcG9zLnNlY29uZCArIGtndG1vdltwc3RdLnNlY29uZCkgPj0gMCkgJiYgKHJ3IDwgYnJkc3plKSkKCQkJY291dCA8PCAoZmlyc3QrKyA/ICgocHN0ID09IGxzdCkgPyAiLCBhbmQgIiA6ICIsICIpIDogIiIpIDw8IGNoYXIoY2wgKyAnQScpIDw8IHJ3ICsgMTsKCgljb3V0IDw8IGVuZGw7Cn0K