现在的位置: 首页 > 综合 > 正文

2719: [Violet 4]银河之星 (DFS+Hash)

2018年01月13日 ⁄ 综合 ⁄ 共 1342字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#define ll long long
using namespace std;
const int xx[4] = {0, 1, 1, 1} , yy[4] = {1, -1, 0, 1};
int n, m, k, xt, yt, sz, ans[1005];
ll bin[15], bg, ed;
bool mp[10][10];
map < ll, int > q;
void add(int x1, int y1, int x2, int y2){
    x1 = (x1 + 3) % 3;
    x2 = (x2 + 3) % 3;
    y1 = (y1 + 3) % 3;
    y2 = (y2 + 3) % 3;
    int u = x1 * 3+y1, v = x2 * 3+y2;
    mp[u][v] = 1;
}

void pre(){
    int a1, a2, b1, b2;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
    for (int k = 0; k < 4; k++){
        a1 = i + xx[k], b1 = j + yy[k];
        a2 = a1 + xx[k], b2 = b1 + yy[k];
        if (a2 + xx[k] < n && b2 + yy[k] < m)
                add(i, j, a2, b2);
        if (a2 < n && b2 < m)
            add(i, j, a1, b1);
    }
}

int dfs(ll x){
    if (x == ed)
        return 1;
    int a, b, a1, a2, b1, b2, t;
    if (q[x])
        t = q[x];
    else
        t = q[x] = ++sz;
    if (ans[t])
        return ans[t];
    for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++){
        int t = i * 3+j;
        if (x / bin[t] % 11)
        for (int k = 0; k < 4; k++){
            a1 = (i + xx[k] + 3) % 3, b1 = (j + yy[k] + 3) % 3;
            a2 = (a1 + xx[k] + 3) % 3, b2 = (b1 + yy[k] + 3) % 3;
            a = a1 * 3+b1, b = a2 * 3+b2;
            if ((x / bin[a] % 11) && mp[t][a])
                if (dfs(x - bin[t] - bin[a] + bin[b]) == 1)
                    return ans[t] = 1;
            if ((x / bin[b] % 11) && mp[t][b])
                if (dfs(x - bin[t] - bin[b] + bin[a]) == 1)
                    return ans[t] = 1;
        }
    }
    return ans[t] =  - 1;
}

int main(){
    bin[0] = 1;
    for (int i = 1; i <= 10; i++)
        bin[i] = bin[i - 1] *11;
    while (scanf("%d%d%d%d%d", &k, &n, &m, &xt, &yt) != EOF){
        q.clear();
        sz = bg = 0;
        memset(ans, 0, sizeof(ans));
        memset(mp, 0, sizeof(mp));
        pre();
        xt = (xt + 2) % 3;
        yt = (yt + 2) % 3;
        ed = bin[xt *3+yt];
        int x, y, v;
        for (int i = 1; i <= k; i++){
            scanf("%d%d", &x, &y);
            x = (x + 2) % 3;
            y = (y + 2) % 3;
            v = x * 3+y;
            bg += bin[v];
        }
        if (dfs(bg) == 1)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

抱歉!评论已关闭.