This question looks like enumeration at the beginning, but it is found that there are a total of 12 cases, which are not counted at first. In the end, we finally found that the boundary was not handled. Well, I am too lazy to handle it. Put it here first.
# Include <stdio. h> # include <string> # include <sstream> # include <math. h> # include <string. h ># include <iostream> using namespace STD; int grid [201] [201], is_legal [201] [201]; int main () {int n, m; while (CIN> N> M & N & M) {memset (grid, 0, sizeof (GRID); memset (is_legal, 0, sizeof (is_legal); char temp; int flag = 1; for (INT I = 0; I <n; I ++) for (Int J = 0; j <m; j ++) {CIN> temp; If (temp = '#') {grid [I] [J] = 1; is_leg Al [I] [J] = 1;} If (temp = '. ') {grid [I] [J] = 0; is_legal [I] [J] = 0 ;}} int sum = 0; For (INT I = 0; I <n; I ++) for (Int J = 0; j <m; j ++) {int flagt = 0; if (I! = N-1 & J! = M-1) {If (! Grid [I] [J] &! Grid [I] [J + 1] &! Grid [I + 1] [J + 1] & (! Is_legal [I] [J] |! Is_legal [I] [J + 1] &! Is_legal [I + 1] [J + 1]) {is_legal [I] [J] = 1; is_legal [I] [J + 1] = 1; is_legal [I + 1] [J + 1] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J + 1] &! Grid [I + 1] [J] & (! Is_legal [I] [J] |! Is_legal [I] [J + 1] &! Is_legal [I + 1] [J]) {is_legal [I] [J] = 1; is_legal [I] [J + 1] = 1; is_legal [I + 1] [J] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I + 1] [J] &! Grid [I + 1] [J + 1] & (! Is_legal [I] [J] |! Is_legal [I + 1] [J] &! Is_legal [I + 1] [J + 1]) {is_legal [I] [J] = 1; is_legal [I + 1] [J] = 1; is_legal [I + 1] [J + 1] = 1; sum ++; flagt = 1 ;}} if (I! = N-1 & J! = 0) {If (! Grid [I] [J] &! Grid [I + 1] [J-1] &! Grid [I + 1] [J] & (! Is_legal [I] [J] |! Is_legal [I + 1] [J-1] &! Is_legal [I + 1] [J]) {is_legal [I] [J] = 1; is_legal [I + 1] [J-1] = 1; is_legal [I + 1] [J] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J-1] &! Grid [I + 1] [J] & (! Is_legal [I] [J] |! Is_legal [I] [J-1] &! Is_legal [I + 1] [J]) {is_legal [I] [J] = 1; is_legal [I] [J-1] = 1; is_legal [I + 1] [J] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J-1] &! Grid [I + 1] [J-1] & (! Is_legal [I] [J] |! Is_legal [I] [J-1] &! Is_legal [I + 1] [J-1]) {is_legal [I] [J] = 1; is_legal [I] [J-1] = 1; is_legal [I + 1] [J-1] = 1; sum ++; flagt = 1 ;}} if (I! = 0 & J! = M-1) {If (! Grid [I] [J] &! Grid [I-1] [J] &! Grid [I] [J + 1] & (! Is_legal [I] [J] |! Is_legal [I-1] [J] &! Is_legal [I] [J + 1]) {is_legal [I] [J] = 1; is_legal [I-1] [J] = 1; is_legal [I] [J + 1] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I-1] [J] &! Grid [I-1] [J + 1] & (! Is_legal [I] [J] |! Is_legal [I-1] [J] &! Is_legal [I-1] [J + 1]) {is_legal [I] [J] = 1; is_legal [I-1] [J] = 1; is_legal [I-1] [J + 1] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J + 1] &! Grid [I-1] [J + 1] & (! Is_legal [I] [J] |! Is_legal [I] [J + 1] &! Is_legal [I-1] [J + 1]) {is_legal [I] [J] = 1; is_legal [I] [J + 1] = 1; is_legal [I-1] [J + 1] = 1; sum ++; flagt = 1 ;}} if (I! = 0 & J! = 0) {If (! Grid [I] [J] &! Grid [I-1] [J] &! Grid [I-1] [J-1] & (! Is_legal [I] [J] |! Is_legal [I-1] [J] &! Is_legal [I-1] [J-1]) {is_legal [I] [J] = 1; is_legal [I-1] [J] = 1; is_legal [I-1] [J-1] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J-1] &! Grid [I-1] [J-1] & (! Is_legal [I] [J] |! Is_legal [I] [J-1] &! Is_legal [I-1] [J-1]) {is_legal [I] [J] = 1; is_legal [I] [J-1] = 1; is_legal [I-1] [J-1] = 1; sum ++; flagt = 1;} else if (! Grid [I] [J] &! Grid [I] [J-1] &! Grid [I-1] [J] & (! Is_legal [I] [J] |! Is_legal [I] [J-1] &! Is_legal [I-1] [J]) {is_legal [I] [J] = 1; is_legal [I] [J-1] = 1; is_legal [I-1] [J] = 1; sum ++; flagt = 1 ;}} if (! Flagt &&! Is_legal [I] [J]) {flag = 0; break;} // I didn't judge it at first. If I didn't exit in time, an error occurred.} int Wandan = 0; if (Wandan |! Flag) printf ("-1 \ n"); else printf ("% d \ n", sum) ;}return 0 ;}
Data not passed (the boundary is not processed properly ):
4
.##.
..#.
..#.
..#.
2 4
.##.
####
2 4
.###
####
5
2
1