fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int dx[] = {0, 0, 1, -1}, mod = 1000000007;
  5. int dy[] = {1, -1, 0, 0}, n, cg = 0, tot = 0, cb = 0, cp = 0, q = 0, vis[57][57];
  6. vector<string> v;
  7.  
  8. int issafe(int x, int y)
  9. {
  10. if(x < 0 || x == n || y < 0 || y == n || v[x][y] == '.' || vis[x][y] == 1)
  11. return 0;
  12. else return 1;
  13. }
  14.  
  15. int dfs(int x, int y)
  16. {
  17. tot++;
  18. vis[x][y] = 1;
  19.  
  20. if(v[x][y] == 'B') cb++;
  21. else if(v[x][y] == 'P') cp++;
  22. else if(v[x][y] == 'G') cg++;
  23. else if(v[x][y] == '?') q++;
  24.  
  25. for(int i = 0; i < 4; i++)
  26. {
  27. if(issafe(x+dx[i],y+dy[i]))
  28. dfs(x+dx[i], y+dy[i]);
  29. }
  30. return 0;
  31. }
  32.  
  33. int main()
  34. {
  35. int t;
  36.  
  37. cin>>t;
  38.  
  39. while(t--)
  40. {
  41. memset(vis, 0, sizeof(vis));
  42.  
  43. v.clear();
  44.  
  45. cin>>n;
  46.  
  47. int ans = 1;
  48.  
  49. string s;
  50.  
  51. for(int i = 0; i < n; i++)
  52. {
  53. cin>>s;
  54. v.push_back(s);
  55. }
  56.  
  57. for(int i = 0; i < n; i++)
  58. {
  59. for(int j = 0; j < n; j++)
  60. {
  61. if(v[i][j] != '.' && vis[i][j] != 1)
  62. {
  63. int temp = 0;
  64. cg = 0, tot = 0, cb = 0, cp = 0, q = 0;
  65. dfs(i,j);
  66. if(tot == 1)
  67. {
  68. if(q == 1) temp += 3;
  69. else temp += 1;
  70. }
  71. else
  72. {
  73. if(cg > 0 || (cb > 0 && cp > 0)) temp = 0;
  74. else if(q > 0)
  75. {
  76. if(cb > 0 || cp > 0) temp += 1;
  77. else temp += 2;
  78. }
  79. else temp += 1;
  80. }
  81. ans = (ans * temp)%mod;
  82. }
  83. }
  84. }
  85. cout<<ans<<"\n";
  86. }
  87. return 0;
  88. }
  89.  
Success #stdin #stdout 0s 16080KB
stdin
6
3
..?
.?B
G..
2
GG
..
3
?..
.??
??.
3
??P
???
??B
7
?.?.?.?
.?.?.?.
?.?.?.?
.?.?.?.
?.?.?.?
.?.?.?.
?.?.?.?
2
PP
PP
stdout
1
0
6
0
288603514
1