Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <stdlib.h>
- #include <utility>
- #include <fstream>
- #include <queue>
- #define MAX 503
- #define critical 25
- #define very_less 10
- #define is_green 14700000
- #define few 50
- using namespace std;
- typedef pair < int, int > ii;
- int T;
- int H, W;
- int picture[MAX][MAX];
- bool vis[MAX][MAX];
- int di[] = {-1, -1, -1, 0, 1, 1, 1, 0};
- int dj[] = {-1, 0, 1, 1, 1, 0, -1, -1};
- int getR(int RGB) { return (RGB >> 16) & 0xFF; }
- int getG(int RGB) { return (RGB >> 8) & 0xFF; }
- int getB(int RGB) { return RGB & 0xFF; }
- bool the_same(int RGB1, int RGB2) {
- int r1 = getR(RGB1); int r2 = getR(RGB2);
- int g1 = getG(RGB1); int g2 = getG(RGB2);
- int b1 = getB(RGB1); int b2 = getB(RGB2);
- return ((abs(r1-r2) < critical)&&(abs(b1-b2) < critical)&&(abs(g1-g2) < critical));
- }
- bool ok(int i, int j) {
- return ((i < H) && (i > -1) && (j < W) && (j > -1));
- }
- void dfs(int x, int y) {
- queue < ii > q;
- q.push(ii(x, y));
- while (!q.empty()) {
- ii next = q.front();
- q.pop();
- int i = next.first;
- int j = next.second;
- vis[i][j] = true;
- for (int k=0; k<8; k++) {
- if (ok(i+di[k], j+dj[k]))
- if (!vis[i+di[k]][j+dj[k]])
- if (the_same(picture[i][j], picture[i+di[k]][j+dj[k]])) {
- vis[i+di[k]][j+dj[k]] = true;
- q.push(ii(i+di[k], j+dj[k]));
- }
- }
- }
- }
- int Solve() {
- for (int i=0; i<H; i++)
- for (int j=0; j<W; j++)
- vis[i][j] = false;
- /// check for first type
- int parts=0;
- for (int i=0; i<H; i++)
- for (int j=0; j<W; j++)
- if (!vis[i][j]) {
- dfs(i, j);
- parts ++;
- }
- if (parts <= very_less)
- return 4;
- if (parts <= few)
- return 1;
- int green=0;
- int blue=0;
- int red=0;
- for (int i=0; i<H; i++)
- for (int j=0; j<W; j++) {
- green += getG(picture[i][j]);
- red += getR(picture[i][j]);
- blue += getB(picture[i][j]);
- }
- cout << green << endl;
- if (green >= is_green)
- return 2;
- return 3;
- }
- int main()
- {
- //ifstream fin("style-2-0.in");
- cin >> T;
- while (T --) {
- cin >> H >> W;
- for (int i=0; i<H; i++)
- for (int j=0; j<W; j++)
- cin >> picture[i][j];
- cout << Solve() << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement