Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define double long double
- #define Task ""
- #define READFILE freopen(Task".inp", "r", stdin)
- #define WRITEFILE freopen(Task".out", "w", stdout)
- #define oo 1e18
- #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- #define mp make_pair
- #define pb push_back
- #define fi first
- #define se second
- #define watch(x) cout << (#x) << " = " << x << endl
- #define debug(x) cout << (#x) << " = " << x << endl
- #define all(x) x.begin(), x.end()
- #define sz(x) x.size()
- #define endl '\n'
- #define max3(a,b,c) max(max(a, b), c)
- #define max4(a,b,c,d) max(max(a, b), max(c, d))
- #define min4(a,b,c,d) min(min(a, b), min(c, d))
- #define debug4(a,b,c,d) watch(a);watch(b);watch(c);watch(d)
- #define ever (;true;)
- #define maxn 505
- #define PI 3.14159265
- using namespace std;
- typedef pair < int, int > ii;
- typedef pair < int, ii > iii;
- typedef pair < ii, ii > iiii;
- typedef vector < int > vi;
- typedef vector < ii > vii;
- typedef vector < vi > vvi;
- typedef vector < iii > viii;
- typedef vector < vii > vvii;
- typedef vector < iiii > viiii;
- typedef vector < vvi > vvvi;
- void init(){
- FAST;
- if (fopen(Task".inp", "r")){
- READFILE;
- WRITEFILE;
- }
- }
- const int N = 1e3 + 5;
- int color[N][N];
- bool colored[N][N];
- const int dx[] = {0, 0, 1, 1};
- const int dy[] = {0, 1, 0, 1};
- void Run_case(){
- int n, m;
- cin >> n >> m;
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < m; ++j){
- cin >> color[i][j];
- }
- }
- vector < iii > res;
- memset(colored, 0, sizeof(colored));
- auto ok = [&](ii x) -> int{
- if (x.fi < 0 || x.fi > n - 2 || x.se < 0 || x.se > m - 2)
- return 0;
- set < int > Set;
- for (int dir = 0; dir < 4; ++dir){
- int X = x.fi + dx[dir], Y = x.se + dy[dir];
- if (!colored[X][Y]){
- Set.insert(color[X][Y]);
- }
- }
- if (Set.size() == 0 || Set.size() > 1) return 0;
- for (int dir = 0; dir < 4; ++dir){
- int X = x.fi + dx[dir], Y = x.se + dy[dir];
- colored[X][Y] = 1;
- }
- return *Set.begin();
- };
- queue < ii > q;
- for (int i = 0; i < n - 1; ++i){
- for (int j = 0; j < m - 1; ++j){
- int cur = ok(ii(i, j));
- if (cur != 0){
- res.pb(iii(cur, ii(i, j)));
- q.push(ii(i, j));
- }
- }
- }
- while (q.size()){
- ii u = q.front();
- q.pop();
- for (int DX = -1; DX < 2; DX++){
- for (int DY = -1; DY < 2; DY++){
- if (DX == 0 && DY == 0) continue;
- ii v = ii(u.fi + DX, u.se + DY);
- if (v.fi < 0 || v.fi > n - 2 || v.se < 0 || v.se > m - 2)
- continue;
- int cur = ok(v);
- if (cur != 0){
- q.push(v);
- res.pb(iii(cur, v));
- }
- }
- }
- }
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < m; ++j){
- if (!colored[i][j]){
- cout << -1 << endl;
- return;
- }
- }
- }
- cout << res.size() << endl;
- for (int i = (int)res.size() - 1; i >= 0; --i)
- //for (int i = 0; i < (int)res.size(); ++i)
- {
- cout << res[i].se.fi + 1 << ' ' << res[i].se.se + 1 << ' '
- << res[i].fi << endl;
- }
- }
- void check(){
- ifstream fi(".inp"), fo(".out");
- int n, m;
- fi >> n >> m;
- int a[n][m];
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < m; ++j){
- fi >> a[i][j];
- }
- }
- fi.close();
- int k;
- fo >> k;
- int b[n][m];
- memset(b, 0, sizeof(b));
- while (k--){
- int x, y, c;
- fo >> x >> y >> c;
- x--;
- y--;
- b[x][y] = c;
- b[x+1][y] = c;
- b[x][y+1] = c;
- b[x+1][y+1] = c;
- cerr << x << ' ' << y << ' ' << c << endl;
- for (int i = 0; i < n; ++i){
- for (int j = 0; j < m; ++j){
- cerr << b[i][j] << ' ';
- }
- cerr << endl;
- }
- cerr << endl;
- }
- fo.close();
- bool ok = 1;
- for (int i = 0; i < n && ok; ++i){
- for (int j = 0; j < m && ok; ++j){
- if (a[i][j] != b[i][j]) ok = 0;
- }
- }
- if (ok) cerr << "AC";
- else cerr << "WA";
- exit(0);
- }
- signed main(){
- #ifndef ONLINE_JUDGE
- check();
- #endif // ONLINE_JUDGE
- init();
- int t = 1;
- //cin >> t;
- while (t--){
- Run_case();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement