fork download
  1. #include <iostream>
  2. #include <stack>
  3.  
  4. int i, j, k, A[1002][1002], B[1002][1002], N, M;
  5.  
  6. void F(int x, int y) {
  7. std::stack <int> a;
  8. std::stack <int> b;
  9. a.push(x);
  10. b.push(y);
  11. do {
  12. x = a.top();
  13. y = b.top();
  14. a.pop();
  15. b.pop();
  16. if (B[x][y] == 1) continue;
  17. B[x][y] = 1;
  18. --k;
  19. if (A[x-1][y] == 4 && B[x-1][y] == 0) {a.push(x-1); b.push(y);};
  20. if (A[x+1][y] == 2 && B[x+1][y] == 0) {a.push(x+1); b.push(y);};
  21. if (A[x][y-1] == 1 && B[x][y-1] == 0) {a.push(x); b.push(y-1);};
  22. if (A[x][y+1] == 3 && B[x][y+1] == 0) {a.push(x); b.push(y+1);};
  23. } while (!a.empty());
  24. }
  25.  
  26. int main() {
  27. std::cin >> N >> M;
  28. k = N*M;
  29. for (i=1; i<=N; ++i)
  30. for (j=1; j<=M; ++j)
  31. std::cin >> A[i][j];
  32. if ((A[1][1] == 2 || A[1][1] == 3) && B[1][1] == 0) F(1, 1);
  33. if ((A[1][M] == 1 || A[1][M] == 2) && B[1][M] == 0) F(1, M);
  34. if ((A[N][M] == 1 || A[N][M] == 4) && B[N][M] == 0) F(N, M);
  35. if ((A[N][1] == 3 || A[N][1] == 4) && B[N][1] == 0) F(N, 1);
  36. for (i=2; i<M; ++i)
  37. if (A[1][i] == 2 && B[1][i] == 0) F(1, i);
  38. for (i=2; i<M; ++i)
  39. if (A[N][i] == 4 && B[N][i] == 0) F(N, i);
  40. for (i=2; i<N; ++i)
  41. if (A[i][1] == 3 && B[i][1] == 0) F(i, 1);
  42. for (i=2; i<N; ++i)
  43. if (A[i][M] == 1 && B[i][M] == 0) F(i, M);
  44. std::cout << k;
  45. return 0;
  46. }
Success #stdin #stdout 0s 5600KB
stdin
	2 2
1 2
3 4
stdout
Standard output is empty