fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define ft first
  4. #define sc second
  5. #define el '\n'
  6. #define boost ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  7. #define file(name) freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout)
  8. #define pb push_back
  9. #define all(x) (x).begin(),(x).end()
  10. using namespace std;
  11. const ll N = 1000;
  12. ll n, m, a[N + 1][N + 1];
  13. bool SUKUNA[N + 1][N + 1], GOJO[N + 1][N + 1];
  14. pair<ll, ll> sukuna, gojo;
  15. vector<pair<ll, ll>> d = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
  16. pair<pair<ll, ll>, pair<ll, ll>> AMON[N + 5];
  17.  
  18. void read() {
  19. cin >> n >> m;
  20.  
  21. for(ll i = 1; i <= n; i ++) {
  22. for(ll j = 1; j <= m; j ++) {
  23. cin >> a[i][j];
  24. if(sukuna.ft == 0 && (a[i][j] == 1 || a[i][j] == 3)) {
  25. sukuna = {i, j};
  26. }
  27. if(gojo.ft == 0 && (a[i][j] == 2 || a[i][j] == 3)) {
  28. gojo = {i, j};
  29. }
  30. }
  31. }
  32. }
  33.  
  34. void dfsSUKUNA(ll x, ll y) {
  35. SUKUNA[x][y] = 1;
  36.  
  37. for(auto [i, j] : d) {
  38. ll new_i = i + x;
  39. ll new_j = j + y;
  40. if(new_i < 1 || new_i > n || new_j < 1 || new_j > m
  41. || a[new_i][new_j] == 2 || a[new_i][new_j] == 0
  42. || SUKUNA[new_i][new_j]) continue;
  43.  
  44. dfsSUKUNA(new_i, new_j);
  45. }
  46. }
  47.  
  48. void dfsGOJO(ll x, ll y) {
  49. GOJO[x][y] = 1;
  50.  
  51. for(auto &[i, j] : d) {
  52. ll new_i = i + x;
  53. ll new_j = j + y;
  54. if(new_i < 1 || new_i > n || new_j < 1 || new_j > m
  55. || a[new_i][new_j] == 1 || a[new_i][new_j] == 0
  56. || GOJO[new_i][new_j]) continue;
  57.  
  58. dfsGOJO(new_i, new_j);
  59. }
  60. }
  61.  
  62. void solve() {
  63. dfsSUKUNA(sukuna.ft, sukuna.sc);
  64.  
  65. for(ll i = 1; i <= n; i ++) {
  66. ll dau = 0, cuoi = 0;
  67. for(ll j = 1; j <= m; j ++) {
  68. if(SUKUNA[i][j]) {
  69. dau = j;
  70. break;
  71. }
  72. }
  73.  
  74. for(ll j = m; j >= 1; j --) {
  75. if(SUKUNA[i][j]) {
  76. cuoi = j;
  77. break;
  78. }
  79. }
  80.  
  81. for(ll j = dau; j <= cuoi; j ++) {
  82. SUKUNA[i][j] = 1;
  83. }
  84. }
  85.  
  86. dfsGOJO(gojo.ft, gojo.sc);
  87.  
  88. for(ll i = 1; i <= n; i ++) {
  89. ll dau = 0, cuoi = 0;
  90. for(ll j = 1; j <= m; j ++) {
  91. if(GOJO[i][j]) {
  92. dau = j;
  93. break;
  94. }
  95. }
  96.  
  97. for(ll j = m; j >= 1; j --) {
  98. if(GOJO[i][j]) {
  99. cuoi = j;
  100. break;
  101. }
  102. }
  103.  
  104. for(ll j = dau; j <= cuoi; j ++) {
  105. GOJO[i][j] = 1;
  106. }
  107. }
  108.  
  109. ll cnt = 0;
  110.  
  111. for(ll i = 1; i <= n; i ++) {
  112. for(ll j = 1; j <= m; j ++) {
  113. if(SUKUNA[i][j] && GOJO[i][j]) cnt ++;
  114. }
  115. }
  116.  
  117. cout << cnt;
  118. }
  119.  
  120. void write() {
  121.  
  122. }
  123.  
  124. int main() {
  125. boost;
  126. //file();
  127. read();
  128. solve();
  129. write();
  130. return 0;
  131. }
  132.  
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
Standard output is empty