#include 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; }