Advertisement
Guest User

Untitled

a guest
May 29th, 2015
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <utility>
  5. #include <fstream>
  6. #include <queue>
  7.  
  8. #define MAX 503
  9. #define critical 25
  10. #define very_less 10
  11. #define is_green 14700000
  12. #define few 50
  13.  
  14. using namespace std;
  15.  
  16. typedef pair < int, int > ii;
  17.  
  18. int T;
  19. int H, W;
  20. int picture[MAX][MAX];
  21. bool vis[MAX][MAX];
  22. int di[] = {-1, -1, -1, 0, 1, 1, 1, 0};
  23. int dj[] = {-1, 0, 1, 1, 1, 0, -1, -1};
  24.  
  25. int getR(int RGB) { return (RGB >> 16) & 0xFF; }
  26.  
  27. int getG(int RGB) { return (RGB >> 8) & 0xFF; }
  28.  
  29. int getB(int RGB) { return RGB & 0xFF; }
  30.  
  31. bool the_same(int RGB1, int RGB2) {
  32. int r1 = getR(RGB1); int r2 = getR(RGB2);
  33. int g1 = getG(RGB1); int g2 = getG(RGB2);
  34. int b1 = getB(RGB1); int b2 = getB(RGB2);
  35.  
  36. return ((abs(r1-r2) < critical)&&(abs(b1-b2) < critical)&&(abs(g1-g2) < critical));
  37. }
  38.  
  39. bool ok(int i, int j) {
  40. return ((i < H) && (i > -1) && (j < W) && (j > -1));
  41. }
  42.  
  43. void dfs(int x, int y) {
  44. queue < ii > q;
  45. q.push(ii(x, y));
  46.  
  47. while (!q.empty()) {
  48. ii next = q.front();
  49. q.pop();
  50. int i = next.first;
  51. int j = next.second;
  52. vis[i][j] = true;
  53.  
  54. for (int k=0; k<8; k++) {
  55. if (ok(i+di[k], j+dj[k]))
  56. if (!vis[i+di[k]][j+dj[k]])
  57. if (the_same(picture[i][j], picture[i+di[k]][j+dj[k]])) {
  58. vis[i+di[k]][j+dj[k]] = true;
  59. q.push(ii(i+di[k], j+dj[k]));
  60. }
  61. }
  62. }
  63. }
  64.  
  65. int Solve() {
  66. for (int i=0; i<H; i++)
  67. for (int j=0; j<W; j++)
  68. vis[i][j] = false;
  69.  
  70. /// check for first type
  71.  
  72. int parts=0;
  73.  
  74. for (int i=0; i<H; i++)
  75. for (int j=0; j<W; j++)
  76. if (!vis[i][j]) {
  77. dfs(i, j);
  78. parts ++;
  79. }
  80.  
  81. if (parts <= very_less)
  82. return 4;
  83.  
  84. if (parts <= few)
  85. return 1;
  86.  
  87. int green=0;
  88. int blue=0;
  89. int red=0;
  90.  
  91. for (int i=0; i<H; i++)
  92. for (int j=0; j<W; j++) {
  93. green += getG(picture[i][j]);
  94. red += getR(picture[i][j]);
  95. blue += getB(picture[i][j]);
  96. }
  97.  
  98. cout << green << endl;
  99.  
  100. if (green >= is_green)
  101. return 2;
  102.  
  103. return 3;
  104. }
  105.  
  106. int main()
  107. {
  108. //ifstream fin("style-2-0.in");
  109.  
  110. cin >> T;
  111.  
  112. while (T --) {
  113. cin >> H >> W;
  114.  
  115. for (int i=0; i<H; i++)
  116. for (int j=0; j<W; j++)
  117. cin >> picture[i][j];
  118.  
  119. cout << Solve() << endl;
  120. }
  121.  
  122. return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement