Ho scritto questo codice per risolvere solitario2 ma non capisco perché l’output del codice supera sempre quello giusto di uno o di due. Ho creato una matrice con 2 zeri in più per lato per evitare problemi quando controllo se la x si può aggiungere.
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
int avanti(int N, int M, vector<vector<int>> G, int c, int r){
int opz1,opz2;
opz1=0;
if(c==M+1 && r==N+1){
return 0;
}
if(c!=M+1){
opz1=avanti(N,M,G,c+1,r);
}
else{
opz1=avanti(N,M,G,2,r+1);
}
opz2=0;
// i controlli dovrebbero stare bene
if(!(G[r-1][c+1]==1 && G[r+1][c-1]==1)&&!(G[r-1][c-1]==1 && G[r+1][c+1]==1)&&!(G[r-1][c]==1 && G[r+1][c]==1)&&!(G[r][c-1]==1 && G[r][c+1]==1)&&!(G[r-1][c]==1 && G[r-2][c]==1)&&!(G[r+1][c]==1 && G[r+2][c]==1)&&!(G[r][c-1]==1 && G[r][c-2]==1)&&!(G[r][c+1]==1 && G[r][c+2]==1)&&!(G[r-1][c-1]==1 && G[r-2][c-2]==1)&&!(G[r+1][c-1]==1 && G[r+2][c-2]==1)&&!(G[r-1][c+1]==1 && G[r-2][c+2]==1)&&!(G[r+1][c+1]==1 && G[r+2][c+2]==1))
{
G[r][c]=1;
/*
cout<<endl;
for(int a=0;a<N+4;a++){
for(int b=0;b<M+4;b++){
cout<<G[a][b]<<" ";
}
cout<<endl;
}*/
if(c!=M+1){
opz2=avanti(N,M,G,c+1,r)+1;
}
else{
opz2=avanti(N,M,G,2,r+1)+1;
}
}
return max (opz1,opz2);
}
int gioca(int N, int M, vector<vector<int>> G)
{
vector<vector<int>> V(N+4,vector<int> (M+4));
for(int r=2;r<N+2;r++){
for(int c=2;c<M+2;c++){
V[r][c]=G[r-2][c-2];
}
}/*
cout<<endl;
for(int r=0;r<N+4;r++){
for(int c=0;c<M+4;c++){
cout<<V[r][c]<<" ";
}
cout<<endl;
}
*/
return avanti(N,M,V,2,2);
}
int main()
{
int N, M;
cin >> N >> M;
assert(cin.good());
vector<vector<int>> G(N, vector<int>(M));
for(auto& x : G)
for(auto& y : x)
cin >> y;
assert(cin.good());
cout << gioca(N, M, G) << endl;
}