Title:
Give you a N * M table. The number of row i and column j is (i - 1) * m + j. now you need to rearrange the position of the number. Ask if you have a scheme to make the original adjacent number not adjacent.
Explanation:
Random mischief.
Given two seconds, we set the program to execute 1.9 seconds when the exit random, output NO.
while (clock() < 1.9 * CLOCKS_PER_SEC)
At the beginning, use random_suffix directly to judge whether it is feasible at present by violence. If not, continue. But this search is too slow, wa.
Then I think that every time random_suffix is followed by O (n * m) judgment. If there are only a few wrong positions, there is no need to re random_suffix.
If the current location is not feasible, then we will continue to exchange with the later location rand() 100 times. If it is still not feasible, then random? Shuffle again.
And then there's A...
As for why it can be done randomly, it's probably because there are many answers. It's still easy to search.
Code:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <bitset> #include <map> #include <vector> #include <stack> #include <set> #include <unordered_map> #include <unordered_set> #include <cmath> #include <ctime> #ifdef LOCAL #define debug(x) cout<<#x<<" = "<<(x)<<endl; #else #define debug(x) 1; #endif #define chmax(x,y) x=max(x,y) #define chmin(x,y) x=min(x,y) #define lson id<<1,l,mid #define rson id<<1|1,mid+1,r #define lowbit(x) x&-x #define mp make_pair #define pb push_back #define fir first #define sec second using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, int> pii; const ll MOD = 1e9 + 7; const double eps = 1e-10; const int INF = 0x3f3f3f3f; const ll INFLL = 0x3f3f3f3f3f3f3f3f; const int MAXN = 1e6 + 5; int a[MAXN]; int n, m; int check (int i) { if (i % m != 0) if (abs (a[i] - a[i - 1]) == 1 || abs (a[i] - a[i - 1]) == m) return true; if (i >= m) if (abs (a[i] - a[i - m]) == 1 || abs (a[i] - a[i - m]) == m) return true; return 0; } int main() { #ifdef LOCAL freopen ("input.txt", "r", stdin); #endif scanf ("%d %d", &n, &m); for (int i = 0; i < n * m; i++) a[i] = i + 1; int ok = 0; while (clock() < 1.9 * CLOCKS_PER_SEC) { random_shuffle (a, a + n * m); int f = 0; for (int i = 0; i < n * m; i++) { int cnt = 0; while (check (i) && cnt <= 100) { if (i < n * m - 1) swap (a[i], a[rand() % (n * m - i - 1) + i + 1]); else cnt = INF; cnt++; } if (cnt > 100) { f = 1; break; } } if (f) continue; ok = 1; puts ("YES"); for (int i = 1; i <= n; i++) { for (int j = 0; j < m; j++) printf ("%d ", a[ (i - 1) * m + j]); puts (""); } break; } if (!ok) puts ("NO"); return 0; }