#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

int feladvany[10][10];
struct egymegoldas{

    string nev;
    int megoldasa[10][10];

}megoldas[20];

int megoldasokSzama;
bool hetimegoldas(egymegoldas adat);                    ///igaz értékkel tér vissza, ha eheti a megoldás 3. feladat
int hajokszama(egymegoldas adat);                       ///4. feladat, a megoldásban lévo hajók számát adja meg
bool szabalyos(egymegoldas adat);                       ///hajó körül nincs másik hajó, akkor szabályos
int hajokszama(egymegoldas adat,int i, int j);          ///adott pontból látható hajók száma

int main()
{
    setlocale(LC_ALL, "hun");
    ///1. feladat
    cout << "1. feladat: Adja meg a világítótorony pozicióját egy 10*10-es táblára vonakozóan (sor és oszlop) és a toronyból látható hajók számát: ";
    int sor, oszlop, hajo;
    cin >> sor >> oszlop >> hajo;
    if(hajo>3) cout << "Nehéz torony." << endl;

    ///2. feladat
    cout << "2. feladat: Hajó nem lehet az alábbi helyeken:" << endl;
    for(int i=sor-1;i<=sor+1;i++) {
        for(int j=oszlop-1;j<=oszlop+1;j++) {
            if(i>0 && j>0 && i<11 && j <11 && (i!=sor || j!=oszlop)) {  ///ha a torony a szélén van
                cout << i << " " << j << endl;
            }
        }
    }

    ///3. feladat
    cout << "3. feladat: A feladvány és a megoldások beolvasása." << endl;
    ifstream be;
    be.open("feladvany.txt");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg.";
        cin.get();
        exit(-1);
    }

    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            be >> feladvany[i][j];
        }

    }
    be.close();
    /* csak teszt
    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            cout << feladvany[i][j] << " ";
        }
        cout << endl;
    }
    */
    ifstream be2;
    be2.open("megoldas.txt");
    if(be2.fail()) {

        cout << "A fájl nem nyitható meg.";
        cin.get();
        exit(-1);
    }

    be2 >> megoldasokSzama;
    int k=0;
    while(!be2.eof()){
        be2 >> megoldas[k].nev;
        for(int i=0; i<10; i++){
            for(int j=0; j<10; j++){
                be2 >> megoldas[k].megoldasa[i][j];
            }
        }
        k++;
    }
    be2.close();
    /* csak teszt
    for(k=0; k<megoldasokSzama; k++) {
        cout << megoldas[k].nev << endl;
        for(int i=0; i<10; i++){
            for(int j=0; j<10; j++){
                cout <<  megoldas[k].megoldasa[i][j] << " ";
            }
        cout << endl;
        }
    }
    */

    cout << "Nem erre a hétre adott megoldások: " << endl;
    int hibadb=0;
    for(k=0; k<megoldasokSzama; k++) {
        if(!hetimegoldas(megoldas[k])) {
            cout << megoldas[k].nev << endl;
            hibadb++;
        }
    }
    if(!hibadb) cout << "Mindegyik megoldás erre a heti feladványra érkezett." << endl;

    ///4. feladat
    cout << "4. feladat: Azok az eheti megoldások, amelyekben 12-nél kevesebb hajó van: ";
    int hibas=0;
    for(k=0; k<megoldasokSzama; k++) {

        if(hetimegoldas(megoldas[k]) && hajokszama(megoldas[k])<12) hibas++;
    }
    cout << hibas << endl;

    ///5. feladat
    cout << "5. feladat: Szabálytalan megoldások száma: " ;
    hibas=0;
    for(k=0; k<megoldasokSzama; k++) {

        if(hetimegoldas(megoldas[k]) && hajokszama(megoldas[k])==12 && !szabalyos(megoldas[k])) {

            hibas++;
            ///cout << megoldas[k].nev << " " ; ///csak teszt
        }
    }
    cout << hibas << endl;

    ///6. feladat
    cout << "6. feladat: Helyes megoldók: " << endl;
    string helyesbekuldok[megoldasokSzama];
    int l=0;
    for(k=0; k<megoldasokSzama; k++) {

        if(hetimegoldas(megoldas[k]) && hajokszama(megoldas[k])==12 && szabalyos(megoldas[k])) {
        bool jo=true;
           for(int i=0; i<10; i++){
                for(int j=0; j<10; j++){

                    if(hajokszama(megoldas[k],i,j)!=megoldas[k].megoldasa[i][j] &&
                       ///csak toronyból
                       megoldas[k].megoldasa[i][j]>0 && megoldas[k].megoldasa[i][j]<11) jo=false;

                }
           }
            if(jo){
                helyesbekuldok[l]=megoldas[k].nev;
                l++;
            }
        }

    }
    cout << "A helyes megoldók száma: " << l << endl;
    for(int i=0; i<l; i++){
        cout <<  helyesbekuldok[i] << endl;
    }
    return 0;
}

bool hetimegoldas(egymegoldas adat){
    bool eheti=true;
    int i=0;
    int j=0;
        while(eheti && i<10) {
            while(j<10){
                if(adat.megoldasa[i][j]!=feladvany[i][j] && adat.megoldasa[i][j]!=11) {
                        eheti=false;
                }
                j++;
            }
        i++;
        }
    return eheti;
}

int hajokszama(egymegoldas adat){
    int darab=0;
    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            if(adat.megoldasa[i][j]==11) darab++;
        }
    }
    return darab;
}

bool szabalyos(egymegoldas adat){
    bool hiba=false;
    int sor=0;
    int oszlop=0;
    while(!hiba && sor<11){
        while( oszlop<11) {
            for(int i=sor-1;i<=sor+1;i++) {
                for(int j=oszlop-1;j<=oszlop+1;j++) {
                    if(i>0 && j>0 && i<11 && j <11 && (i!=sor || j!=oszlop)) {
                        if(adat.megoldasa[sor][oszlop]==11 && adat.megoldasa[i][j]!=0) hiba=true;
                    }
                }
            }
            oszlop++;
        }
        sor++;
    }


    return hiba;

}

int hajokszama(egymegoldas adat,int i, int j){
    int db=0;
    for(int sor=0; sor<10; sor++){
        if(adat.megoldasa[i][sor]==11 ) db++; ///ugyanabban a sorban
    }
    for(int oszlop=0; oszlop<10; oszlop++){
        if(adat.megoldasa[oszlop][j]==11 ) db++; ///ugyanabban az  oszlopban
    }
    for(int sor=0; sor<10; sor++){
        for(int oszlop=0; oszlop<10; oszlop++){
            if((sor+oszlop==i+j || sor-oszlop==i-j) && adat.megoldasa[i][j]==11) db++; ///két átló
        }

    }

    return db;

}
