Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define spc << ' ' <<
- #define spce << ' '
- #define ele << '\n'
- #define el << '\n' <<
- #define cout cout <<
- #define INF 99999
- #define AINF -99999
- #define ULINT unsigned long long int
- #define LINT long long int
- using namespace std;
- template<typename tmp>
- void output(vector<tmp>& vc, char en = ' ') {
- for (tmp x : vc)
- cout x << en;
- }
- template<typename tmp>
- void input(vector<tmp>& vc) {
- for (tmp& x : vc)
- cin >> x;
- }
- bool cmax(int&, int);
- bool cmin(int&, int);
- int bit_degree(int, int);
- int nod(int, int);
- int c = 0;
- int l = 8;
- vector<pair<int, int> > taken;
- set<vector<pair<int, int> > > s;
- char* mt;
- char* mp(int x, int y) {
- return &mt[x + y * l];
- }
- void paint_up(int x, int y) {
- taken.push_back({x, y});
- *mp(x, y) += 1;
- for (int i = 0; i < x; ++i)
- *mp(i, y) += 1;
- for (int i = x + 1; i < l; ++i)
- *mp(i, y) += 1;
- for (int i = 0; i < y; ++i)
- *mp(x, i) += 1;
- for (int i = y + 1; i < l; ++i)
- *mp(x, i) += 1;
- for (int i = 1; y - i >= 0 && x - i >= 0; ++i)
- *mp(x - i, y - i) += 1;
- for (int i = 1; y + i < l && x + i < l; ++i)
- *mp(x + i, y + i) += 1;
- for (int i = 1; y - i >= 0 && x + i < l; ++i)
- *mp(x + i, y - i) += 1;
- for (int i = 1; y + i < l && x - i >= 0; ++i)
- *mp(x - i, y + i) += 1;
- }
- void remove_paint() {
- int x, y;
- x = (*(taken.end() - 1)).first;
- y = (*(taken.end() - 1)).second;
- *mp(x, y)-= 1;
- for (int i = 0; i < x; ++i)
- *mp(i, y) -= 1;
- for (int i = x + 1; i < l; ++i)
- *mp(i, y) -= 1;
- for (int i = 0; i < y; ++i)
- *mp(x, i) -= 1;
- for (int i = y + 1; i < l; ++i)
- *mp(x, i) -= 1;
- for (int i = 1; y - i >= 0 && x - i >= 0; ++i)
- *mp(x - i, y - i) -= 1;
- for (int i = 1; y + i < l && x + i < l; ++i)
- *mp(x + i, y + i) -= 1;
- for (int i = 1; y - i >= 0 && x + i < l; ++i)
- *mp(x + i, y - i) -= 1;
- for (int i = 1; y + i < l && x - i >= 0; ++i)
- *mp(x - i, y + i) -= 1;
- taken.pop_back();
- }
- bool take_next(int num = 8) {
- if (num == 0) {
- sort(taken.begin(), taken.end());
- s.insert(taken);
- return true;
- }
- auto t = find(mt, mt + l * l, 0);
- while (t != mt + l * l) {
- int tmp = t - mt;
- paint_up(tmp % l, tmp / l);
- bool tb = take_next(num - 1);
- if (tb && num != l) {
- remove_paint();
- return tb;
- } else {
- remove_paint();
- t = find(t + 1, mt + l * l, 0);
- }
- }
- return false;
- }
- int main() {
- cin >> l;
- mt = new char[l * l];
- for (int i = 0; i < l * l; ++i)
- mt[i] = 0;
- take_next(l);
- int c = 0;
- if (s.size())
- for_each(s.begin(), s.end(), [&c](vector<pair<int, int> > ta){cout ++c << ':' ele; for (auto x : ta) cout char(int('a') + x.first) << x.second + 1 spce; cout '\n'; });
- else
- cout "No answer";
- }
- int nod(int a, int b) {
- return b ? nod(b, a % b) : a;
- }
- bool cmax(int& a, int b) {
- if (a >= b)
- return false;
- else {
- a = b;
- return true;
- }
- }
- bool cmin(int& a, int b) {
- if (a <= b)
- return false;
- else {
- a = b;
- return true;
- }
- }
- int bit_degree(int a, int b) {
- if (b != 1)
- if (!(b % 2)) {
- b /= 2;
- int tmp = bit_degree(a, b);
- return tmp * tmp;
- } else {
- b--;
- return (bit_degree(a, b) * a);
- }
- else
- return a;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement