CSES - Datatähti 2020 alku - Results
Submission details
Task:Ketjupeli
Sender:patamaski
Submission time:2019-10-05 15:12:41 +0300
Language:text
Status:READY
Result:0
Feedback
groupverdictscore
#10
Test results
testverdicttimescore
#10.00 s0details

Code

#include <bits/stdc++.h>

using namespace std;
const int V = 30;

// Tulostaa kuvion
/*void tulostus(bool *arvot)
{
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			if (*(arvot + V*j + i) == 0)
			{
				cout << "  ";
			}
			else
			{
				cout << " X";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
}*/

int main()
{
	// Lopussa tarvittavia
	int siirtoja = 0;
	int siirrot_talteen_alku[201][2];
	int siirrot_talteen_loppu[201][2];
	int vaihtoehtoja = 0;
	int valinta = 0;
	int alkupiste = 0;
	bool onko_mahdollisia_siirtoja = 0;
	int mahdollisia_siirtoja = 0;
/*	bool onko_mukavaa_siirtoa = 0;
	int mukava_siirto[6];
	int mukavan_tyyppi = 0;
	int suunta_x = 0;
	int suunta_y = 0;*/


	bool ruutu[V][V];
	bool mahdollisuus[V][V][4];
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			ruutu[i][j] = 0;
			for (int k = 0; k < 4; ++k)
			{
				mahdollisuus[i][j][k] = 0;
			}
		}
	}

	// 0 = ->
	// 1 = <-
	// 2 = ylös
	// 3 = alas
	// 4 = koillinen
	// 5 = kaakko
	// 6 = lounas
	// 7 = luode
	bool suunnat[V][V][4];
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			for (int k = 0; k < 4; ++k)
			{
				suunnat[i][j][k] = 0;
			}
		}
	}

	// Ristin vasen reuna
	ruutu[10][13] = 1;
	ruutu[10][14] = 1;
	ruutu[10][15] = 1;
	ruutu[10][16] = 1;

	// Ristin oikea reuna
	ruutu[19][13] = 1;
	ruutu[19][14] = 1;
	ruutu[19][15] = 1;
	ruutu[19][16] = 1;

	// Ristin alareuna
	ruutu[13][19] = 1;
	ruutu[14][19] = 1;
	ruutu[15][19] = 1;
	ruutu[16][19] = 1;

	// Ristin yläreuna
	ruutu[13][10] = 1;
	ruutu[14][10] = 1;
	ruutu[15][10] = 1;
	ruutu[16][10] = 1;

	// Ristin koillisreuna
	ruutu[16][11] = 1;
	ruutu[16][12] = 1;
	ruutu[16][13] = 1;
	ruutu[17][13] = 1;
	ruutu[18][13] = 1;

	// Ristin kaakkoisreuna
	ruutu[16][18] = 1;
	ruutu[16][17] = 1;
	ruutu[16][16] = 1;
	ruutu[17][16] = 1;
	ruutu[18][16] = 1;

	// Ristin lounaisreuna
	ruutu[13][18] = 1;
	ruutu[13][17] = 1;
	ruutu[13][16] = 1;
	ruutu[12][16] = 1;
	ruutu[11][16] = 1;

	// Ristin luoteisreuna
	ruutu[13][11] = 1;
	ruutu[13][12] = 1;
	ruutu[13][13] = 1;
	ruutu[12][13] = 1;
	ruutu[11][13] = 1;

	// Testi
//	ruutu[21][4] = 1;
//	ruutu[22][3] = 1;
//	ruutu[23][2] = 1;
//	ruutu[24][1] = 1;
//	ruutu[25][0] = 1;


	// Laittaa kaikkien pisteiden suunniksi ykköset
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			if (ruutu[i][j] == 1)
			{
				for (int k = 0; k < 4; ++k)
				{
					suunnat[i][j][k] = 1;
				}
			}
		}
	}



	// *************************************************************************
	// Palaa tähän
	alku:
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			for (int k = 0; k < 4; ++k)
			{
				mahdollisuus[i][j][k] = 0;
			}
		}
	}

	onko_mahdollisia_siirtoja = 0;
	mahdollisia_siirtoja = 0;
//	onko_mukavaa_siirtoa = 0;
//	for (int i = 0; i < 6; ++i)
//	{
//		mukava_siirto[i] = 0;
//	}

	// Etsii sopivat (sivuttain)
	bool testi = 0;
	int eteen = 0;
	int taakse = 0;
	bool eteen_0 = 0;
	bool taakse_0 = 0;
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (i + k + 1 < V && ruutu[i+k+1][j] == 1 && suunnat[i+k+1][j][0] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (i - k - 1 >= 0 && ruutu[i-k-1][j] == 1 && suunnat[i-k-1][j][0] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}
				if (eteen + taakse > 3)
				{
					mahdollisuus[i][j][0] = 1;
					onko_mahdollisia_siirtoja = 1;
					// Etsii mahdollisen reunan, jos löytyy, laittaa mahd. lähelle sitä
/*					if (suunnat[i+eteen+1][j][0] == 0 && ruutu[i+eteen+1][j] == 1)
					{
						cout << "mukava: " << eteen << " " << taakse << "\n";
						onko_mukavaa_siirtoa = 1;
						mukavan_tyyppi = 0;
						mukava_siirto[0] = i + eteen - 4;
						mukava_siirto[1] = j;
						mukava_siirto[2] = i + eteen;
						mukava_siirto[3] = j;
						mukava_siirto[4] = i;
						mukava_siirto[5] = j;
					}
					else if (suunnat[i-taakse-1][j][0] == 0 && ruutu[i-taakse-1][j] == 1)
					{
						cout << "mukava: " << eteen << " " << taakse << "\n";
						onko_mukavaa_siirtoa = 1;
						mukavan_tyyppi = 0;
						mukava_siirto[0] = i - taakse;
						mukava_siirto[1] = j;
						mukava_siirto[2] = i - taakse + 4;
						mukava_siirto[3] = j;
						mukava_siirto[4] = i;
						mukava_siirto[5] = j;
					}*/
				}
			}
		}
	}
	// Etsii sopivat pystyttäin
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (j + k + 1 < V && ruutu[i][j+k+1] == 1 && suunnat[i][j+k+1][1] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (j - k - 1 >= 0 && ruutu[i][j-k-1] == 1 && suunnat[i][j-k-1][1] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}
				if (eteen + taakse > 3)
				{
					mahdollisuus[i][j][1] = 1;
					onko_mahdollisia_siirtoja = 1;
				}
			}
		}
	}

/*	for (int i = 0; i < V - 4; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i+1][j] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i+k+2][j] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][0] = 1;
					}
				}
			}
		}
	}*/
/*	// Etsii sopivat (<-)
	testi = 0;
	for (int i = 4; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i-1][j] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i-k-2][j] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][1] = 1;
					}
				}
			}
		}
	}*/
/*	// Etsii sopivat (ylös)
	testi = 0;
	for (int i = 0; i < V; ++i)
	{
		for (int j = 4; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i][j-1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i][j-k-1] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][2] = 1;
					}
				}
			}
		}
	}*/
/*	// Etsii sopivat (alas)
	testi = 0;
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V - 4; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i][j+1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i][j+k+2] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][3] = 1;
					}
				}
			}
		}
	}*/
	// Etsii sopivat (koillinen – lounas)
	testi = 0;
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (i + k + 1 < V && j - k - 1 >= 0 && ruutu[i+k+1][j-k-1] == 1 && suunnat[i+k+1][j-k-1][2] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (i - k - 1 >= 0 && j + k + 1 < V && ruutu[i-k-1][j+k+1] == 1 && suunnat[i-k-1][j+k+1][2] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}
				if (eteen + taakse > 3)
				{
					mahdollisuus[i][j][2] = 1;
					onko_mahdollisia_siirtoja = 1;
				}
/*				if (ruutu[i+1][j-1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i+k+2][j-k-2] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][4] = 1;
					}
				}*/
			}
		}
	}
	// Etsii sopivat (kaakko – luode)
	testi = 0;
	for (int i = 0; i < V; ++i)
	{
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (i + k + 1 < V && j + k + 1 < V && ruutu[i+k+1][j+k+1] == 1 && suunnat[i+k+1][j+k+1][3] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (i - k - 1 >= 0 && j - k - 1 >= 0 && ruutu[i-k-1][j-k-1] == 1 && suunnat[i-k-1][j-k-1][3] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}
				if (eteen + taakse > 3)
				{
					mahdollisuus[i][j][3] = 1;
					onko_mahdollisia_siirtoja = 1;
				}
			}
		}
	}
/*	// Etsii sopivat (kaakko)
	testi = 0;
	for (int i = 0; i < V - 4; ++i)
	{
		for (int j = 0; j < V - 4; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i+1][j+1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i+k+2][j+k+2] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][5] = 1;
					}
				}
			}
		}
	}*/
/*	// Etsii sopivat (lounas)
	testi = 0;
	for (int i = 4; i < V; ++i)
	{
		for (int j = 0; j < V - 4; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i-1][j+1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i-k-2][j+k+2] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][6] = 1;
					}
				}
			}
		}
	}*/
/*	// Etsii sopivat (luode)
	testi = 0;
	for (int i = 4; i < V; ++i)
	{
		for (int j = 4; j < V; ++j)
		{
			testi = 0;
			if (ruutu[i][j] == 0)
			{
				if (ruutu[i-1][j-1] == 1)
				{
					for (int k = 0; k < 3; ++k)
					{
						if (ruutu[i-k-2][j-k-2] != 1)
						{
							testi = 1;
						}
					}
					if (testi == 0)
					{
						mahdollisuus[i][j][7] = 1;
					}
				}
			}
		}
	}*/

	string kirjaimet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int koordinaatit[50][2];
	int menneet = 0;
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		cout << "|";
		for (int j = 0; j < V; ++j)
		{
			testi = 0;
			if (ruutu[j][i] == 0)
			{
				for (int k = 0; k < 4; ++k)
				{
					if (mahdollisuus[j][i][k] == 1)
					{
						testi = 1;
					}
				}
				if (testi == 0)
				{
					cout << "  ";
				}
				else
				{
					cout << " " << kirjaimet[menneet%50];
					koordinaatit[menneet%50][0] = j;
					koordinaatit[menneet%50][1] = i;
					menneet++;
					mahdollisia_siirtoja++;
				}
			}
			else
			{
				cout << " ·";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";

	// Tulostaa suunnan nolla pisteet
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		cout << "|";
		for (int j = 0; j < V; ++j)
		{
			if (ruutu[j][i] == 1)
			{
				if (suunnat[j][i][0] == 1)
				{
					cout << " ·";
				}
				else
				{
					cout << " X";
				}
			}
			else
			{
				cout << "  ";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";

	// Tulostaa suunnan yksi pisteet
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		cout << "|";
		for (int j = 0; j < V; ++j)
		{
			if (ruutu[j][i] == 1)
			{
				if (suunnat[j][i][1] == 1)
				{
					cout << " ·";
				}
				else
				{
					cout << " X";
				}
			}
			else
			{
				cout << "  ";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";

	// Tulostaa suunnan kaksi pisteet
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		cout << "|";
		for (int j = 0; j < V; ++j)
		{
			if (ruutu[j][i] == 1)
			{
				if (suunnat[j][i][2] == 1)
				{
					cout << " ·";
				}
				else
				{
					cout << " X";
				}
			}
			else
			{
				cout << "  ";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";

	// Tulostaa suunnan kolme pisteet
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";
	for (int i = 0; i < V; ++i)
	{
		cout << "|";
		for (int j = 0; j < V; ++j)
		{
			if (ruutu[j][i] == 1)
			{
				if (suunnat[j][i][3] == 1)
				{
					cout << " ·";
				}
				else
				{
					cout << " X";
				}
			}
			else
			{
				cout << "  ";
			}
		}
		cout << "|\n";
	}
	cout << "–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––\n";

//	tulostus(ruutu);

	// Talletus
	char pelattava;
	// Manuaalinen valinta
//	cin >> pelattava;
	// Automaattinen valinta
	pelattava = 'a';
	// Monimutkaisempi
	if (siirtoja%4 == 2)
	{
//		cout << mahdollisia_siirtoja << kirjaimet[mahdollisia_siirtoja%50];
		if (mahdollisia_siirtoja > 1)
		{
			pelattava = kirjaimet[(mahdollisia_siirtoja-1)%50];
		}
	}
	else if (siirtoja%4 == 1)
	{
//		cout << mahdollisia_siirtoja << kirjaimet[mahdollisia_siirtoja%50];
		if (mahdollisia_siirtoja > 2)
		{
			pelattava = kirjaimet[(mahdollisia_siirtoja/2-1)%50];
		}
	}
	else if (siirtoja%4 == 3)
	{
//		cout << mahdollisia_siirtoja << kirjaimet[mahdollisia_siirtoja%50];
		if (mahdollisia_siirtoja > 4)
		{
			pelattava = kirjaimet[(mahdollisia_siirtoja/2+1)%50];
		}
	}

	if (pelattava == '0' || onko_mahdollisia_siirtoja == 0)
	{
		cout << siirtoja << "\n";
		for (int i = 0; i < siirtoja; ++i)
		{
			cout << siirrot_talteen_alku[i][0] - 14 << " " << siirrot_talteen_alku[i][1] - 14 << " " << siirrot_talteen_loppu[i][0] - 14 << " " << siirrot_talteen_loppu[i][1] - 14 << "\n";
		}
		return 0;
	}
	for (int i = 0; i < 50; ++i)
	{
/*		if (onko_mukavaa_siirtoa == 1)
		{
			// Laittaa uuden pisteen suuntien arvoiksi 1 (vapaa)
			for (int j = 0; j < 4; ++j)
			{
				suunnat[mukava_siirto[4]][mukava_siirto[5]][j] = 1;
			}
			// Merkkaa ruudun käytetyksi
			ruutu[mukava_siirto[4]][mukava_siirto[5]] = 1;
			// Tallettaa siirron
			siirrot_talteen_alku[siirtoja][0] = mukava_siirto[0];
			siirrot_talteen_alku[siirtoja][1] = mukava_siirto[1];
			siirrot_talteen_loppu[siirtoja][0] = mukava_siirto[2];
			siirrot_talteen_loppu[siirtoja][1] = mukava_siirto[3];
			siirtoja++;
			// Merkkaa janan keskipisteisiin tämän suunnan käydyksi
			for (int j = 1; j < 4; ++j)
			{
				if (mukavan_tyyppi == 0)
				{
					suunta_x = j;
					suunta_y = 0;
				}
				suunnat[mukava_siirto[0] + suunta_x][mukava_siirto[1] + suunta_y][mukavan_tyyppi] = 0;
			}
			cout << "(" << mukava_siirto[4] - 14 << " " << mukava_siirto[5] - 14 << ")\n";
//			cin >> onko_mukavaa_siirtoa;
			break;
		}
		else*/ if (pelattava == kirjaimet[i])
		{
			vaihtoehtoja = 0;
			ruutu[koordinaatit[i][0]][koordinaatit[i][1]] = 1;
			for (int j = 0; j < 4; ++j)
			{
				if (mahdollisuus[koordinaatit[i][0]][koordinaatit[i][1]][j] == 1)
				{
					vaihtoehtoja += pow(2, j);
				}
			}

			// Laittaa uuden pisteen suuntien arvoiksi 1
			for (int j = 0; j < 4; ++j)
			{
				suunnat[koordinaatit[i][0]][koordinaatit[i][1]][j] = 1;
			}
//			cout << vaihtoehtoja << "\n";
			cout << pelattava << " ";
			if (vaihtoehtoja%2 == 1)
			{
				cout << "Vaaka (1)";
				valinta = 1;
			}
			if (vaihtoehtoja%4 > 1)
			{
				if (vaihtoehtoja%2 == 1)
				{
					cout << ", "; 
				}
				cout << "Pysty (2)";
				valinta = 2;
			}
			if (vaihtoehtoja%8 > 3)
			{
				if (vaihtoehtoja%4 != 0)
				{
					cout << ", ";
				}
				cout << "Koillis–lounas (3)";
				valinta = 3;
			}
			if (vaihtoehtoja%16 > 7)
			{
				if (vaihtoehtoja != 8)
				{
					cout << ", ";
				}
				cout << "Kaakko–luode (4)";
				valinta = 4;
			}
			cout << "\n";
			if (vaihtoehtoja != 1 && vaihtoehtoja != 2 && vaihtoehtoja != 4 && vaihtoehtoja != 8)
			{
				cout << "Valitse haluamasi suunta: ";
				cin >> valinta;
			}

			if (valinta == 1)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (koordinaatit[i][0] + k + 1 < V && ruutu[koordinaatit[i][0]+k+1][koordinaatit[i][1]] == 1 && suunnat[koordinaatit[i][0]+k+1][koordinaatit[i][1]][0] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (koordinaatit[i][0] - k - 1 >= 0 && ruutu[koordinaatit[i][0]-k-1][koordinaatit[i][1]] == 1 && suunnat[koordinaatit[i][0]-k-1][koordinaatit[i][1]][0] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}

				if (eteen + taakse == 4)
				{
					// Tallettaa siirron
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1];
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] + eteen;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1];
					siirtoja++;
					// Merkkaa janan keskipisteisiin tämän suunnan käydyksi
					for (int j = 1; j < 4; ++j)
					{
						// [x - taakse + j][y][suunta]
						suunnat[koordinaatit[i][0] - taakse + j][koordinaatit[i][1]][0] = 0;
					}
				}
				if (eteen + taakse > 4)
				{
					cout << "Vaihtoehdot:";
					for (int j = 4; j <= eteen + taakse; ++j)
					{
						cout << " [" << j-3 << "]: (" << koordinaatit[i][0] - taakse - 18 + j << " " << koordinaatit[i][1] - 14 << ")";
					}
					cout << "\nValitse alkupiste:";

					// Manuaalinen valinta
//					cin >> alkupiste;
					// Automaattinen valinta
					alkupiste = 1;
					// Etsii mahdollisen reunan, jos löytyy, laittaa mahd. lähelle sitä
					if (suunnat[koordinaatit[i][0]+eteen+1][koordinaatit[i][1]][0] == 1)
					{
						// Suurin mahdollinen
						alkupiste = eteen + taakse - 3;
					}
					cout << alkupiste << "\n";
					// Automaattinen valinta päättyy

					// Merkkaa janan keskipisteisiin, tämän suunnan käydyksi
					for (int k = 0; k < 3; ++k)
					{
						suunnat[koordinaatit[i][0] - taakse + k + alkupiste][koordinaatit[i][1]][0] = 0;
					}
					// Tallettaa siirron
					// alku[x] = x - taakse (+ vakio)
					// alku[y] = y - taakse (+ vakio)
					// loppu[x] = x + eteen (+ vakio)
					// loppu[y] = x + eteen (+ vakio)
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste - 1;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1];
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste + 3;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1];
					siirtoja++;
				}
//				cout << eteen << " " << taakse << "\n";
			}
			else if (valinta == 2)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					if (koordinaatit[i][1] + k + 1 < V && ruutu[koordinaatit[i][0]][koordinaatit[i][1]+k+1] == 1 && suunnat[koordinaatit[i][0]][koordinaatit[i][1]+k+1][1] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (koordinaatit[i][1] - k - 1 >= 0 && ruutu[koordinaatit[i][0]][koordinaatit[i][1]-k-1] == 1 && suunnat[koordinaatit[i][0]][koordinaatit[i][1]-k-1][1] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}

				if (eteen + taakse == 4)
				{
					// Tallettaa siirron
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0];
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] - taakse;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0];
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] + eteen;
					siirtoja++;
					for (int j = 1; j < 4; ++j)
					{
						suunnat[koordinaatit[i][0]][koordinaatit[i][1] - taakse + j][1] = 0;
					}
				}
				if (eteen + taakse > 4)
				{
					cout << "Vaihtoehdot:";
					for (int j = 4; j <= eteen + taakse; ++j)
					{
						cout << " [" << j-3 << "]: (" << koordinaatit[i][0] - 14 << " " << koordinaatit[i][1] - taakse - 18 + j << ")";
					}
					cout << "\nValitse alkupiste:";

					// Manuaalinen valinta
//					cin >> alkupiste;
					// Automaattinen valinta
					alkupiste = 1;
					// Etsii mahdollisen reunan, jos löytyy, laittaa mahd. lähelle sitä
					if (suunnat[koordinaatit[i][0]][koordinaatit[i][1]+eteen+1][1] == 1)
					{
						// Suurin mahdollinen
						alkupiste = eteen + taakse - 3;
					}
					cout << alkupiste << "\n";
					// Automaattinen valinta päättyy

					for (int k = 0; k < 3; ++k)
					{
						suunnat[koordinaatit[i][0]][koordinaatit[i][1] - taakse + k + alkupiste][1] = 0;
					}
					// Tallettaa siirron
					// alku[x] = x - taakse (+ vakio)
					// alku[y] = y - taakse (+ vakio)
					// loppu[x] = x + eteen (+ vakio)
					// loppu[y] = x + eteen (+ vakio)
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0];
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] - taakse + alkupiste - 1;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0];
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] - taakse + alkupiste + 3;
					siirtoja++;
				}
			}
			else if (valinta == 3)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					// Jos x-koordinaatti + jotain on tarpeeksi pieni &&
					// Jos y-koordinaatti - jotain on riittävän suuri &&
					// Jos ruudussa (x, y) on piste &&
					// Jos ruudun (x, y) kautta ei ole samansuuntaista janaa &&
					// Jos edelliset kohdat toimineet (ts. lopettaa, jos hyppy [xx-x -> vain 2])
					if (koordinaatit[i][0] + k + 1 < V && koordinaatit[i][1] - k - 1 >= 0 && ruutu[koordinaatit[i][0]+k+1][koordinaatit[i][1]-k-1] == 1 && suunnat[koordinaatit[i][0]+k+1][koordinaatit[i][1]-k-1][2] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (koordinaatit[i][0] - k - 1 >= 0 && koordinaatit[i][1] + k + 1 < V && ruutu[koordinaatit[i][0]-k-1][koordinaatit[i][1]+k+1] == 1 && suunnat[koordinaatit[i][0]-k-1][koordinaatit[i][1]+k+1][2] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}

				if (eteen + taakse == 4)
				{
					// Tallettaa siirron
					// alku[x] = x - taakse
					// alku[y] = y + taakse
					// loppu[x] = x + eteen
					// loppu[y] = x - eteen
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] + taakse;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] + eteen;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] - eteen;
					siirtoja++;
					for (int j = 1; j < 4; ++j)
					{
						suunnat[koordinaatit[i][0] - taakse + j][koordinaatit[i][1] + taakse - j][2] = 0;
					}
				}
				if (eteen + taakse > 4)
				{
					cout << "Vaihtoehdot:";
					for (int j = 4; j <= eteen + taakse; ++j)
					{
						cout << " [" << j-3 << "]: (" << koordinaatit[i][0] - taakse - 18 + j << " " << koordinaatit[i][1] - taakse - 18 + j << ")";
					}
					cout << "\nValitse alkupiste:";

					// Manuaalinen valinta
//					cin >> alkupiste;
					// Automaattinen valinta
					alkupiste = 1;
					// Etsii mahdollisen reunan, jos löytyy, laittaa mahd. lähelle sitä
					if (suunnat[koordinaatit[i][0]+eteen+1][koordinaatit[i][1]-eteen-1][2] == 1)
					{
						// Suurin mahdollinen
						alkupiste = eteen + taakse - 3;
					}
					cout << alkupiste << "\n";
					// Automaattinen valinta päättyy

					for (int k = 0; k < 3; ++k)
					{
						suunnat[koordinaatit[i][0] - taakse + k + alkupiste][koordinaatit[i][1] + taakse + k + alkupiste][2] = 0;
					}
					// Tallettaa siirron
					// alku[x] = x - taakse (+ vakio)
					// alku[y] = y - taakse (+ vakio)
					// loppu[x] = x + eteen (+ vakio)
					// loppu[y] = x + eteen (+ vakio)
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste - 1;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] + taakse + alkupiste - 1;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste + 3;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] + taakse + alkupiste - 5;
					siirtoja++;
				}
			}
			else if (valinta == 4)
			{
				eteen = 0;
				taakse = 0;
				eteen_0 = 0;
				taakse_0 = 0;
				for (int k = 0; k < 4; ++k)
				{
					// Jos x-koordinaatti + jotain on tarpeeksi pieni &&
					// Jos y-koordinaatti + jotain on tarpeeksi pieni &&
					// Jos ruudussa (x, y) on piste &&
					// Jos ruudun (x, y) kautta ei ole samansuuntaista janaa &&
					// Jos edelliset kohdat toimineet (ts. lopettaa, jos hyppy [xx-x -> vain 2])
					if (koordinaatit[i][0] + k + 1 < V && koordinaatit[i][1] + k + 1 < V && ruutu[koordinaatit[i][0]+k+1][koordinaatit[i][1]+k+1] == 1 && suunnat[koordinaatit[i][0]+k+1][koordinaatit[i][1]+k+1][3] == 1 && eteen_0 == 0)
					{
						eteen++;
					}
					else
					{
						eteen_0 = 1;
					}

					if (koordinaatit[i][0] - k - 1 >= 0 && koordinaatit[i][1] - k - 1 >= 0 && ruutu[koordinaatit[i][0]-k-1][koordinaatit[i][1]-k-1] == 1 && suunnat[koordinaatit[i][0]-k-1][koordinaatit[i][1]-k-1][3] == 1 && taakse_0 == 0)
					{
						taakse++;
					}
					else
					{
						taakse_0 = 1;
					}
				}

				if (eteen + taakse == 4)
				{
					// Tallettaa siirron
					// alku[x] = x - taakse
					// alku[y] = y - taakse
					// loppu[x] = x + eteen
					// loppu[y] = x + eteen
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] - taakse;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] + eteen;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] + eteen;
					siirtoja++;

					// Merkkaa janan keskipisteisiin, tämän suunnan käydyksi
					for (int j = 1; j < 4; ++j)
					{
						// [x-taakse+j][y-taakse+j]
						suunnat[koordinaatit[i][0] - taakse + j][koordinaatit[i][1] - taakse + j][3] = 0;
					}
				}
				if (eteen + taakse > 4)
				{
					cout << "Vaihtoehdot:";
					for (int j = 4; j <= eteen + taakse; ++j)
					{
						cout << " [" << j-3 << "]: (" << koordinaatit[i][0] - taakse - 18 + j << " " << koordinaatit[i][1] - taakse - 18 + j << ")";
					}
					cout << "\nValitse alkupiste:";

					// Manuaalinen valinta
//					cin >> alkupiste;
					// Automaattinen valinta
					alkupiste = 1;
					// Etsii mahdollisen reunan, jos löytyy, laittaa mahd. lähelle sitä
					if (suunnat[koordinaatit[i][0]+eteen+1][koordinaatit[i][1]+eteen+1][3] == 1)
					{
						// Suurin mahdollinen
						alkupiste = eteen + taakse - 3;
					}
					cout << alkupiste << "\n";
					// Automaattinen valinta päättyy

					for (int k = 0; k < 3; ++k)
					{
						suunnat[koordinaatit[i][0] - taakse + k + alkupiste][koordinaatit[i][1] - taakse + k + alkupiste][3] = 0;
					}
					// Tallettaa siirron
					// alku[x] = x - taakse (+ vakio)
					// alku[y] = y - taakse (+ vakio)
					// loppu[x] = x + eteen (+ vakio)
					// loppu[y] = x + eteen (+ vakio)
					siirrot_talteen_alku[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste - 1;
					siirrot_talteen_alku[siirtoja][1] = koordinaatit[i][1] - taakse + alkupiste - 1;
					siirrot_talteen_loppu[siirtoja][0] = koordinaatit[i][0] - taakse + alkupiste + 3;
					siirrot_talteen_loppu[siirtoja][1] = koordinaatit[i][1] - taakse + alkupiste + 3;
					siirtoja++;
				}
			}
		}
	}

	goto alku;


	return 0;
}

Test details

Test 1

Verdict:

input
(empty)

correct output
(empty)

user output
#include <bits/stdc++.h>

using namespace std;
const int V = 30;

...