P4205智慧珠游戏

· · 个人记录

纯暴力, 没啥讲的,码农题。

注意分类,优先选择上面行,左边列的点建图。

题目链接

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>

using namespace std;

typedef long long ll;

ll g[110][110], vis[30], tim;

bool ok() {
    bool flag = 1;
    for (ll i = 1; i <= 10; i++) {
        for (ll j = 1; j <= i; j++) {
            if (g[i][j] == 0) {
                flag = 0;
            }
        }
    }
    return flag;
}

ll gtn(char x) {
    return x - 'A' + 1; 
}

char gtc(ll x) {
    return x - 1 + 'A';
}

bool cant(ll x, ll y) {
    return g[x][y] != 0;
}

namespace a {
    ll num = 4, cnt = 3;
    ll gx[4][3] = {{0, 0, 1}, {0, 0, 1}, {0, 1, 1}, {0,  1, 1}};
    ll gy[4][3] = {{0, 1, 0}, {0, 1, 1}, {0, 1, 0}, {0, -1, 0}};
};

namespace b {
    ll num = 2, cnt = 4;
    ll gx[2][4] = {{0, 0, 0, 0}, {0, 1, 2, 3}};
    ll gy[2][4] = {{0, 1, 2, 3}, {0, 0, 0, 0}}; 
};

namespace c {
    ll num = 8, cnt = 4;
    ll gx[8][4] = {{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 1, 1, 1}, {0,  1,  1, 1}, {0, 0, 1, 2}, {0, 0, 1, 2}, {0, 1, 2, 2}, {0, 1, 2,  2}};
    ll gy[8][4] = {{0, 1, 2, 0}, {0, 1, 2, 2}, {0, 1, 2, 0}, {0, -2, -1, 0}, {0, 1, 0, 0}, {0, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, -1}};
};

namespace d {
    ll num = 1, cnt = 4;
    ll gx[1][4] = {{0, 0, 1, 1}};
    ll gy[1][4] = {{0, 1, 0, 1}};
};

namespace e {
    ll num = 4, cnt = 5;
    ll gx[4][5] = {{0, 0, 0, 1, 2}, {0, 0, 0, 1, 2}, {0, 1, 2, 2, 2}, {0, 1, 2,  2,  2}};
    ll gy[4][5] = {{0, 1, 2, 0, 0}, {0, 1, 2, 2, 2}, {0, 0, 0, 1, 2}, {0, 0, 0, -1, -2}};
};

namespace f{
    ll num = 8, cnt = 5;
    ll gx[8][5] = {{0, 0, 0, 0, 1}, {0, 0, 0, 0, 1}, {0,  1, 1, 1, 1}, {0, 1, 1,  1,  1}, {0, 1, 2, 3, 2}, {0, 1, 2, 3,  2}, {0, 1, 2, 3, 1}, {0, 1, 2, 3,  1}};
    ll gy[8][5] = {{0, 1, 2, 3, 1}, {0, 1, 2, 3, 3}, {0, -1, 0, 1, 2}, {0, 1, 0, -1, -2}, {0, 0, 0, 0, 1}, {0, 0, 0, 0, -1}, {0, 0, 0, 0, 1}, {0, 0, 0, 0, -1}};
};

namespace gg {
    ll num = 4, cnt = 5;
    ll gx[4][5] = {{0, 0, 0, 1, 1}, {1, 1, 1, 0, 0}, {0, 0, 1, 2, 2}, {0, 0, 1, 2, 2}};
    ll gy[4][5] = {{0, 1, 2, 0, 2}, {0, 1, 2, 0, 2}, {0, 1, 0, 0, 1}, {0, 1, 1, 0, 1}};
};

namespace h {
    ll num = 8, cnt = 5;
    ll gx[8][5] = {{0, 0, 0, 1, 1}, {0, 0, 0, 1, 1}, {0, 0, 1, 1, 1}, {0, 0,  1, 1, 1}, {0, 0, 1, 1, 2}, {0, 0, 1, 1, 2}, {0, 1, 1, 2, 2}, {0, 1,  1, 2,  2}};
    ll gy[8][5] = {{0, 1, 2, 0, 1}, {0, 1, 2, 1, 2}, {0, 1, 0, 1, 2}, {0, 1, -1, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 0, 1, 0, 1}, {0, 0, -1, 0, -1}};
};

namespace ii {
    ll num = 8, cnt = 5;
    ll gx[8][5] = {{0, 0, 0, 1, 1}, {0, 0, 0,  1, 1}, {0, 0, 1,  1,  1}, {0, 0, 1, 1, 1}, {0, 1, 2,  2,  3}, {0, 1, 2, 2, 3}, {0, 1, 1, 2, 3}, {0, 1,  1,  2,  3}};
    ll gy[8][5] = {{0, 1, 2, 2, 3}, {0, 1, 2, -1, 0}, {0, 1, 0, -1, -2}, {0, 1, 1, 2, 3}, {0, 0, 0, -1, -1}, {0, 0, 0, 1, 1}, {0, 0, 1, 1, 1}, {0, 0, -1, -1, -1}};
};

namespace jj {
    ll num = 1, cnt = 5;
    ll gx[1][5] = {{0,  1, 1, 1, 2}};
    ll gy[1][5] = {{0, -1, 0, 1, 0}};
};

namespace kk {
    ll num = 4, cnt = 5;
    ll gx[4][5] = {{0, 1, 1, 2, 2}, {0, 1,  1,  2,  2}, {0, 0, 1,  1,  2}, {0, 0, 1, 1, 2}};
    ll gy[4][5] = {{0, 0, 1, 1, 2}, {0, 0, -1, -1, -2}, {0, 1, 0, -1, -1}, {0, 1, 1, 2, 2}};
};

namespace l {
    ll num = 8, cnt = 5;
    ll gx[8][5] = {{1, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 1, 1, 1, 1}, {0, 1,  1,  1,  1}, {0, 0, 1, 2, 3}, {0, 0, 1, 2, 3}, {0, 1, 2, 3, 3}, {0, 1, 2, 3,  3}};
    ll gy[8][5] = {{0, 1, 2, 3, 0}, {0, 1, 2, 3, 3}, {0, 1, 2, 3, 0}, {0, 0, -1, -2, -3}, {0, 1, 0, 0, 0}, {0, 1, 1, 1, 1}, {0, 0, 0, 0, 1}, {0, 0, 0, 0, -1}};
};

void dfs(ll cnt) {
    tim++;
    if (tim > 3000000) {
        printf("No solution");
        exit(0);
    }
    if (cnt > 12) {
        if (ok()) {
            for (ll i = 1; i <= 10; i++) {
                for (ll j = 1; j <= i; j++) {
                    printf("%c", gtc(g[i][j]));
                }
                printf("\n");
            }
        }
        exit(0);
    }

    /*for (ll i = 1; i <= 10; i++) {
        for (ll j = 1; j <= i; j++) {
            if (g[i][j])
                printf("%c", gtc(g[i][j]));
            else
                printf(".");
        }
        printf("\n"); 
    } 
    printf("\n");*/
    ll x, y;
    for (ll i = 1; i <= 10; i++) {
        bool flag = 0;
        for (ll j = 1; j <= i; j++) {
            if (g[i][j] == 0) {
                x = i, y = j;
                flag = 1;
                break;
            }
        }
        if (flag) break;
    }

    if (!vis[gtn('A')]) {
        for (ll i = 0; i < a::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < a::cnt; j++) {
                if (cant(x+a::gx[i][j], y+a::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < a::cnt; j++) {
                    g[x+a::gx[i][j]][y+a::gy[i][j]] = gtn('A');
                }
                vis[gtn('A')] = 1;
                dfs(cnt+1);
                vis[gtn('A')] = 0;
                for (ll j = 0; j < a::cnt; j++) {
                    g[x+a::gx[i][j]][y+a::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('B')]) {
        for (ll i = 0; i < b::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < b::cnt; j++) {
                if (cant(x+b::gx[i][j], y+b::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < b::cnt; j++) {
                    g[x+b::gx[i][j]][y+b::gy[i][j]] = gtn('B');
                }
                vis[gtn('B')] = 1;
                dfs(cnt+1);
                vis[gtn('B')] = 0;
                for (ll j = 0; j < b::cnt; j++) {
                    g[x+b::gx[i][j]][y+b::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('C')]) {
        for (ll i = 0; i < c::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < c::cnt; j++) {
                if (cant(x+c::gx[i][j], y+c::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < c::cnt; j++) {
                    g[x+c::gx[i][j]][y+c::gy[i][j]] = gtn('C');
                }
                vis[gtn('C')] = 1;
                dfs(cnt+1);
                vis[gtn('C')] = 0;
                for (ll j = 0; j < c::cnt; j++) {
                    g[x+c::gx[i][j]][y+c::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('D')]) {
        for (ll i = 0; i < d::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < d::cnt; j++) {
                if (cant(x+d::gx[i][j], y+d::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < d::cnt; j++) {
                    g[x+d::gx[i][j]][y+d::gy[i][j]] = gtn('D');
                }
                vis[gtn('D')] = 1;
                dfs(cnt+1);
                vis[gtn('D')] = 0;
                for (ll j = 0; j < d::cnt; j++) {
                    g[x+d::gx[i][j]][y+d::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('E')]) {
        for (ll i = 0; i < e::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < e::cnt; j++) {
                if (cant(x+e::gx[i][j], y+e::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < e::cnt; j++) {
                    g[x+e::gx[i][j]][y+e::gy[i][j]] = gtn('E');
                }
                vis[gtn('E')] = 1;
                dfs(cnt+1);
                vis[gtn('E')] = 0;
                for (ll j = 0; j < e::cnt; j++) {
                    g[x+e::gx[i][j]][y+e::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('F')]) {
        for (ll i = 0; i < f::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < f::cnt; j++) {
                if (cant(x+f::gx[i][j], y+f::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < f::cnt; j++) {
                    g[x+f::gx[i][j]][y+f::gy[i][j]] = gtn('F');
                }
                vis[gtn('F')] = 1;
                dfs(cnt+1);
                vis[gtn('F')] = 0;
                for (ll j = 0; j < f::cnt; j++) {
                    g[x+f::gx[i][j]][y+f::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('G')]) {
        for (ll i = 0; i < gg::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < gg::cnt; j++) {
                if (cant(x+gg::gx[i][j], y+gg::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < gg::cnt; j++) {
                    g[x+gg::gx[i][j]][y+gg::gy[i][j]] = gtn('G');
                }
                vis[gtn('G')] = 1;
                dfs(cnt+1);
                vis[gtn('G')] = 0;
                for (ll j = 0; j < gg::cnt; j++) {
                    g[x+gg::gx[i][j]][y+gg::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('H')]) {
        for (ll i = 0; i < h::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < h::cnt; j++) {
                if (cant(x+h::gx[i][j], y+h::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < h::cnt; j++) {
                    g[x+h::gx[i][j]][y+h::gy[i][j]] = gtn('H');
                }
                vis[gtn('H')] = 1;
                dfs(cnt+1);
                vis[gtn('H')] = 0;
                for (ll j = 0; j < h::cnt; j++) {
                    g[x+h::gx[i][j]][y+h::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('I')]) {
        for (ll i = 0; i < ii::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < ii::cnt; j++) {
                if (cant(x+ii::gx[i][j], y+ii::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < ii::cnt; j++) {
                    g[x+ii::gx[i][j]][y+ii::gy[i][j]] = gtn('I');
                }
                vis[gtn('I')] = 1;
                dfs(cnt+1);
                vis[gtn('I')] = 0;
                for (ll j = 0; j < ii::cnt; j++) {
                    g[x+ii::gx[i][j]][y+ii::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('J')]) {
        for (ll i = 0; i < jj::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < jj::cnt; j++) {
                if (cant(x+jj::gx[i][j], y+jj::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < jj::cnt; j++) {
                    g[x+jj::gx[i][j]][y+jj::gy[i][j]] = gtn('J');
                }
                vis[gtn('J')] = 1;
                dfs(cnt+1);
                vis[gtn('J')] = 0;
                for (ll j = 0; j < jj::cnt; j++) {
                    g[x+jj::gx[i][j]][y+jj::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('K')]) {
        for (ll i = 0; i < kk::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < kk::cnt; j++) {
                if (cant(x+kk::gx[i][j], y+kk::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < kk::cnt; j++) {
                    g[x+kk::gx[i][j]][y+kk::gy[i][j]] = gtn('K');
                }
                vis[gtn('K')] = 1;
                dfs(cnt+1);
                vis[gtn('K')] = 0;
                for (ll j = 0; j < kk::cnt; j++) { 
                    g[x+kk::gx[i][j]][y+kk::gy[i][j]] = 0;
                }
            }
        }
    }

    if (!vis[gtn('L')]) {
        for (ll i = 0; i < l::num; i++) {
            bool flag = 0;
            for (ll j = 0; j < l::cnt; j++) {
                if (cant(x+l::gx[i][j], y+l::gy[i][j])) {
                    flag = 1;
                    break;
                }
            }
            if (!flag) {
                for (ll j = 0; j < l::cnt; j++) {
                    g[x+l::gx[i][j]][y+l::gy[i][j]] = gtn('L');
                }
                vis[gtn('L')] = 1;
                dfs(cnt+1);
                vis[gtn('L')] = 0;
                for (ll j = 0; j < l::cnt; j++) {
                    g[x+l::gx[i][j]][y+l::gy[i][j]] = 0;
                }
            }
        }
    }
}

int main() {
    //freopen("zhz.out", "w", stdout); 
    ll start = 1;
    memset(g, -1, sizeof(g));
    for (ll i = 1; i <= 10; i++) {
        for (ll j = 1; j <= i; j++) {
            char kk;
            scanf("%c", &kk);
            if (kk == '.') {
                g[i][j] = 0;
            } else {
                if (!vis[gtn(kk)]) {
                    vis[gtn(kk)]++;
                    start++;
                }
                g[i][j] = gtn(kk);
            }
        }
        cin.get();
    }
    dfs(start);
    printf("No solution");
    return 0;
}