/* * First, generate all possibilities. */ #include #include #include using namespace std ; using ll = long long ; const int MAXN = 64 ; char edges[MAXN][MAXN] ; char nodes[MAXN][MAXN] ; char adj[MAXN][MAXN] ; char inp[MAXN][MAXN] ; int n ; // this is size of the edge grid; the node grid is one larger vector> seq ; ll cnt, checks ; void display() { cnt++ ; for (int i=0; i 0 && j > 0 && edges[i-1][j-1]) r = max(r, dfs(i-1, j-1)) ; if (i < n && j < n && edges[i][j]) r = max(r, dfs(i+1, j+1)) ; if (i > 0 && j < n && !edges[i-1][j]) r = max(r, dfs(i-1, j+1)) ; if (i < n && j > 0 && !edges[i][j-1]) r = max(r, dfs(i+1, j-1)) ; nodes[i][j] = r ; return r ; } int check() { checks++ ; for (int i=1; i 0 && j > 0 && edges[i-1][j-1] == 0 && edges[i][j-1] == 1 && edges[i-1][j] == 1) continue ; edges[i][j] = v ; adj[i][j] += v ; adj[i][j+1] += 1-v ; adj[i+1][j] += 1-v ; adj[i+1][j+1] += v ; if ((inp[i][j] == '+' || inp[i][j] == adj[i][j]) && (inp[i][j+1] == '+' || (j+1 == n ? inp[i][j+1] == adj[i][j+1] : inp[i][j+1] >= adj[i][j+1])) && (inp[i+1][j] == '+' || (i + 1 == n ? inp[i+1][j] == adj[i+1][j] : inp[i+1][j] >= adj[i+1][j])) && (inp[i+1][j+1] == '+' || ((i + 1 == n && j + 1 == n) ? inp[i+1][j+1] == adj[i+1][j+1] : inp[i+1][j+1] >= adj[i+1][j+1]))) recur(at+1) ; adj[i][j] -= v ; adj[i][j+1] -= 1-v ; adj[i+1][j] -= 1-v ; adj[i+1][j+1] -= v ; } } } int main() { cin >> n ; string s ; for (int i=0; i<=n; i++) { cin >> s ; for (int j=0; j<=n; j++) inp[i][j] = (s[j] == '+' ? '+' : s[j]-'0') ; } for (int i=0; i