fork download
  1. #include<bits/stdc++.h>
  2. #define s(x) scanf("%d",&(x))
  3. #define p(x) printf("%s ",x)
  4. #define X 1010
  5. using namespace::std;
  6.  
  7. #define fi(i,a,b) for(int i=(a);i<(b);i++)
  8.  
  9. int n ,m, f=0, maxi = 0;
  10. char board[1010][1010], vs[1010][1010];
  11. int dx[] = {-1, 1, 0, 0};
  12. int dy[] = {0, 0, -1, 1};
  13. unordered_map<char, char> nxt;
  14.  
  15. int dfs(int r, int c)
  16. {
  17. vs[r][c] = 'b';
  18. int cnt = (board[r][c] == 'A') ? 1 : 0;
  19. int rc = cnt;
  20. fi(i, 0, 4)
  21. {
  22. int xx = r + dx[i];
  23. int yy = c + dy[i];
  24. if(!f && xx >= 0 && xx < n && yy < m && yy >= 0)
  25. {
  26. if(board[xx][yy] == nxt[board[r][c]])
  27. {
  28. if(vs[xx][yy] == 'b')
  29. {
  30. f = 1;
  31. maxi = 1;
  32. return 0;
  33. }
  34. else if(!f)
  35. {
  36. // cout<<endl<<xx<<' '<<yy;
  37. cnt += dfs(xx, yy);
  38. rc = max(cnt, rc);
  39. cnt=0;
  40. }
  41. }
  42. }
  43. }
  44. vs[r][c] = 'a';
  45. return rc;
  46. }
  47. int main()
  48. {
  49. int D= 1;
  50. nxt.insert(make_pair('D', 'I'));
  51. nxt['I'] = 'M';
  52. nxt['M'] = 'A';
  53. nxt['A'] = 'D';
  54.  
  55. scanf("%d %d", &n, &m);
  56. fi(i, 0, n)
  57. {
  58. scanf("%s", board[i]);
  59. memset(vs[i], 'a', m);
  60. }
  61. for(int i = 0 ; i < n && !f ; ++i)
  62. for(int j = 0 ; j < m && !f ; ++j)
  63. if(board[i][j] == 'D')
  64. {
  65. int auxi = dfs(i, j);
  66. maxi = max(maxi, auxi);
  67. D = 1;
  68. }
  69.  
  70. if(D == 0 || maxi == 0) p("Poor Dima!");
  71.  
  72. else if(f) p("Poor Inna!");
  73.  
  74. else cout<<maxi;
  75. return 0;
  76. }
  77.  
Success #stdin #stdout 0s 5428KB
stdin
5 5
DIMAD
ADDDI
MDDDM
IDDDA
DAMID
stdout
Poor Inna!