Solución al problema número 137 de AceptaelReto - 137.

Cualquier duda no dudes en contactar.


#include <bits/stdc++.h>
using namespace std;

int sx_v[]={1,-1,0,0,1,-1,-1,1}; //8 directions
int sy_v[]={0,0, 1,-1,1,-1,1,-1};

int sx_v1[]={0,0,1,-1,-1,1}; //6 directions
int sy_v1[]={1,-1,1,-1,1,-1};

int sx_v2[]={1,-1,1,-1,-1,1}; //6 directions
int sy_v2[]={0,0 ,1,-1,1,-1};

int main(){
    int B,O;
    int matrix[155][155];
    bool visited[155][155];
    while(scanf("%d",&B)==1 && B!=0){
        map<int,int> M;
        for(int i=0; i<B;i++) { int aux; scanf("%d",&aux); M[aux]++; }
        scanf("%d",&O);
        for(int i=0; i<O;i++)
            for(int j=0; j<O;j++) { scanf("%d",&matrix[i][j]); visited[i][j]=false; }
        bool correct = true;
        for(int i=0; i<O && correct;i++)
            for(int j=0; j<O && correct;j++){
                if(matrix[i][j]==1 && !visited[i][j]) //Ship detected
                {
                    bool check = false;
                    int counter = 1;
                    int auxj = j,auxi=i; visited[i][j]=true;
                    while(auxj+1<O && matrix[i][auxj+1]==1) { // xxx ship
                        check=true;
                        if(auxj==j){
                            //Check first element
                            for(int x=0;x<6 && correct;x++){
                                   int I=auxi+sx_v2[x];
                                   int J=auxj+sy_v2[x];
                                   if(I>=0 && I<O && J>=0 && J<O && matrix[I][J]) correct=false;
                            }
                        }
                        counter++; auxj++;
                        if(visited[i][auxj]) {correct=false; break;}
                        //Check down up diagonals
                        for(int x=0;x<6 && correct;x++){
                               int I=auxi+sx_v2[x];
                               int J=auxj+sy_v2[x];
                               if(I>=0 && I<O && J>=0 && J<O && matrix[I][J]) correct=false;
                        }
                        visited[i][auxj]=true;
                    }
                    while(auxi+1<O && matrix[auxi+1][j]==1) {
                        check=true;
                        if(auxi==i){
                            for(int x=0;x<6 && correct;x++){
                                   int I=auxi+sx_v1[x];
                                   int J=auxj+sy_v1[x];
                                   if(I>=0 && I<O && J>=0 && J<O && matrix[I][J]) correct=false;
                            }
                        }
                        counter++; auxi++;
                        if(visited[auxi][j]) {correct=false; break;}
                        //Check left rigth diagonals
                        for(int x=0;x<6 && correct;x++){
                               int I=auxi+sx_v1[x];
                               int J=auxj+sy_v1[x];
                               if(I>=0 && I<O && J>=0 && J<O && matrix[I][J]) correct=false;
                        }
                        visited[auxi][j]=true;
                    }
                    if(!check){
                        //Check all
                        for(int x=0;x<8 && correct;x++){
                               int I=auxi+sx_v[x];
                               int J=auxj+sy_v[x];
                               if(I>=0 && I<O && J>=0 && J<O && matrix[I][J]) correct=false;
                        }
                    }
                    if(M[counter]>0) M[counter]--;
                    else correct = false;
                }
            }
        for(auto m:M) if(m.second!=0) { correct=false; break; }
        if(correct) printf("SI\n");
        else printf("NO\n");
    }
    return 0;
}

/*
INPUT
3
2 1 1
5
1 0 0 0 0
1 0 0 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
2
2 3
5
0 1 1 1 0
1 0 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
2
2 3
6
0 1 1 0 0 0
0 0 0 0 0 0
0 0 0 1 0 0
0 0 0 1 0 0
0 0 0 1 0 0
0 0 0 0 0 0
2
2 3
5
0 1 1 1 0
0 0 0 0 1
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
2
2 3
5
0 1 1 1 0
0 0 0 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
2
2 3
5
0 1 1 1 0
0 0 0 0 0
0 0 0 0 1
0 0 0 0 1
0 0 0 0 0
2
2 3
5
0 1 1 1 0
0 0 0 0 1
0 0 0 0 1
0 0 1 0 0
0 0 0 0 0
2
3 2
5
0 1 0 1 0
0 0 0 1 1
0 0 1 1 0
1 0 0 0 0
0 1 0 1 1
5
3 1 2 1 1
5
0 0 1 1 1
1 0 0 0 0
0 0 0 0 0
1 0 0 0 0
1 0 1 0 1
4
2 2 3 1
5
0 0 0 0 0
0 0 1 1 0
0 0 0 0 0
1 0 1 0 0
0 1 1 1 0
2
2 1
5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 1 1 0 1
5
1 1 1 1 2
5
1 0 1 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 1
0 1 0 0 1
3
2 3 1
7
0 1 1 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 1 1 0 0 0 0
0 0 0 0 1 0 0
6
1 2 1 1 1 1
7
0 1 0 0 0 1 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 1 0
0 0 0 0 1 0 1
0 0 0 0 0 0 0
12
1 1 1 1 1 2 1 1 4 1 1 1
10
1 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 1 0 0
0 0 1 0 1 0 0 0 0 1
0 0 0 0 0 0 1 0 0 0
0 1 0 1 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
9
1 1 2 2 1 1 2 2 1
10
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 1 0
1 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0 1
0

OUTPUT
NO
NO
SI
NO
NO
SI
NO
NO
SI
NO
SI
SI
SI
NO
SI
NO


*/

No te pierdas nada.

Sigue en contacto con Isaac Lozano Osorio!