ZOJ - 2477 Magic Cube 【迭代加深+模拟】

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2477

从接触acm到现在,一直很抵触ZOJ的题目,我做过的很多ZOJ的题目大部分题意都很模糊,阐述不清楚。

这道题的难点不在搜索,光看题目的问法都应该知道是用迭代加深,但是真正让人崩溃的是什么地方?

首先是立方的展开图,如果没指名哪一面是正面或者背面,对应的顺逆时针方向也会不同,题目没说明怎么办?能咋办,我只有去试啊,我最先是以索引为1的这一面为立方的背面,然后模拟顺逆时针的旋转,一直WA,而且还不敢肯定WA的原因是顺逆时针还是其他地方没写好,当我以索引为1的这一面为正面的时候,重新修改模拟顺逆时针的代码,就AC了。真的无话可说。

 

#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int Maxn = 4e5+10;

int cube[10][4][4];

bool check() {
    for(int i = 0; i < 6; ++i) {
        int tmp = cube[i][0][0];
        for(int j = 0; j < 3; ++j) {
            for(int k = 0; k < 3; ++k) if(tmp != cube[i][j][k]) {
                return false;
            }
        }
    }
    return true;
}

void Size(int x, int dir) {
    if(dir == 1) {
        swap(cube[x][0][0], cube[x][0][2]);
        swap(cube[x][0][0], cube[x][2][2]);
        swap(cube[x][0][0], cube[x][2][0]);
        swap(cube[x][0][1], cube[x][1][2]);
        swap(cube[x][0][1], cube[x][2][1]);
        swap(cube[x][0][1], cube[x][1][0]);
    } else {
        swap(cube[x][0][0], cube[x][2][0]);
        swap(cube[x][0][0], cube[x][2][2]);
        swap(cube[x][0][0], cube[x][0][2]);
        swap(cube[x][0][1], cube[x][1][0]);
        swap(cube[x][0][1], cube[x][2][1]);
        swap(cube[x][0][1], cube[x][1][2]);
    }
}

void solve(int x, int dir) {
    Size(x, dir);
    if(x == 1 && dir == 1) { //
        swap(cube[4][2][0], cube[2][0][0]); swap(cube[4][2][2], cube[2][2][0]);
        swap(cube[4][2][0], cube[5][0][2]); swap(cube[4][2][2], cube[5][0][0]);
        swap(cube[4][2][0], cube[0][2][2]); swap(cube[4][2][2], cube[0][0][2]);
        swap(cube[4][2][1], cube[2][1][0]);
        swap(cube[4][2][1], cube[5][0][1]);
        swap(cube[4][2][1], cube[0][1][2]);
    } else if(x == 1 && dir == -1) {
        swap(cube[4][2][0], cube[0][2][2]); swap(cube[4][2][2], cube[0][0][2]);
        swap(cube[4][2][0], cube[5][0][2]); swap(cube[4][2][2], cube[5][0][0]);
        swap(cube[4][2][0], cube[2][0][0]); swap(cube[4][2][2], cube[2][2][0]);
        swap(cube[4][2][1], cube[0][1][2]);
        swap(cube[4][2][1], cube[5][0][1]);
        swap(cube[4][2][1], cube[2][1][0]);
    }

    if(x == 3 && dir == -1) { //
        swap(cube[4][0][0], cube[2][0][2]); swap(cube[4][0][2], cube[2][2][2]);
        swap(cube[4][0][0], cube[5][2][2]); swap(cube[4][0][2], cube[5][2][0]);
        swap(cube[4][0][0], cube[0][2][0]); swap(cube[4][0][2], cube[0][0][0]);
        swap(cube[4][0][1], cube[2][1][2]);
        swap(cube[4][0][1], cube[5][2][1]);
        swap(cube[4][0][1], cube[0][1][0]);
    } else if(x == 3 && dir == 1) {
        swap(cube[4][0][0], cube[0][2][0]); swap(cube[4][0][2], cube[0][0][0]);
        swap(cube[4][0][0], cube[5][2][2]); swap(cube[4][0][2], cube[5][2][0]);
        swap(cube[4][0][0], cube[2][0][2]); swap(cube[4][0][2], cube[2][2][2]);
        swap(cube[4][0][1], cube[0][1][0]);
        swap(cube[4][0][1], cube[5][2][1]);
        swap(cube[4][0][1], cube[2][1][2]);
    }

    if(x == 2 && dir == -1) { //
        swap(cube[3][0][0], cube[4][2][2]); swap(cube[3][2][0], cube[4][0][2]);
        swap(cube[3][0][0], cube[1][2][2]); swap(cube[3][2][0], cube[1][0][2]);
        swap(cube[3][0][0], cube[5][2][2]); swap(cube[3][2][0], cube[5][0][2]);
        swap(cube[3][1][0], cube[4][1][2]);
        swap(cube[3][1][0], cube[1][1][2]);
        swap(cube[3][1][0], cube[5][1][2]);
    } else if(x == 2 && dir == 1) {
        swap(cube[3][0][0], cube[5][2][2]); swap(cube[3][2][0], cube[5][0][2]);
        swap(cube[3][0][0], cube[1][2][2]); swap(cube[3][2][0], cube[1][0][2]);
        swap(cube[3][0][0], cube[4][2][2]); swap(cube[3][2][0], cube[4][0][2]);
        swap(cube[3][1][0], cube[5][1][2]);
        swap(cube[3][1][0], cube[1][1][2]);
        swap(cube[3][1][0], cube[4][1][2]);
    }

    if(x == 0 && dir == 1) { //
        swap(cube[3][0][2], cube[4][2][0]); swap(cube[3][2][2], cube[4][0][0]);
        swap(cube[3][0][2], cube[1][2][0]); swap(cube[3][2][2], cube[1][0][0]);
        swap(cube[3][0][2], cube[5][2][0]); swap(cube[3][2][2], cube[5][0][0]);
        swap(cube[3][1][2], cube[4][1][0]);
        swap(cube[3][1][2], cube[1][1][0]);
        swap(cube[3][1][2], cube[5][1][0]);
    } else if(x == 0 && dir == -1) {
        swap(cube[3][0][2], cube[5][2][0]); swap(cube[3][2][2], cube[5][0][0]);
        swap(cube[3][0][2], cube[1][2][0]); swap(cube[3][2][2], cube[1][0][0]);
        swap(cube[3][0][2], cube[4][2][0]); swap(cube[3][2][2], cube[4][0][0]);
        swap(cube[3][1][2], cube[5][1][0]);
        swap(cube[3][1][2], cube[1][1][0]);
        swap(cube[3][1][2], cube[4][1][0]);
    }

    if(x == 5 && dir == -1) { //
        swap(cube[3][2][0], cube[2][2][0]); swap(cube[3][2][2], cube[2][2][2]);
        swap(cube[3][2][0], cube[1][2][0]); swap(cube[3][2][2], cube[1][2][2]);
        swap(cube[3][2][0], cube[0][2][0]); swap(cube[3][2][2], cube[0][2][2]);
        swap(cube[3][2][1], cube[2][2][1]);
        swap(cube[3][2][1], cube[1][2][1]);
        swap(cube[3][2][1], cube[0][2][1]);
    } else if(x == 5 && dir == 1) {
        swap(cube[3][2][0], cube[0][2][0]); swap(cube[3][2][2], cube[0][2][2]);
        swap(cube[3][2][0], cube[1][2][0]); swap(cube[3][2][2], cube[1][2][2]);
        swap(cube[3][2][0], cube[2][2][0]); swap(cube[3][2][2], cube[2][2][2]);
        swap(cube[3][2][1], cube[0][2][1]);
        swap(cube[3][2][1], cube[1][2][1]);
        swap(cube[3][2][1], cube[2][2][1]);
    }

    if(x == 4 && dir == -1) { //
        swap(cube[0][0][0], cube[1][0][0]); swap(cube[0][0][2], cube[1][0][2]);
        swap(cube[0][0][0], cube[2][0][0]); swap(cube[0][0][2], cube[2][0][2]);
        swap(cube[0][0][0], cube[3][0][0]); swap(cube[0][0][2], cube[3][0][2]);
        swap(cube[0][0][1], cube[1][0][1]);
        swap(cube[0][0][1], cube[2][0][1]);
        swap(cube[0][0][1], cube[3][0][1]);
    } else if(x == 4 && dir == 1) {
        swap(cube[0][0][0], cube[3][0][0]); swap(cube[0][0][2], cube[3][0][2]);
        swap(cube[0][0][0], cube[2][0][0]); swap(cube[0][0][2], cube[2][0][2]);
        swap(cube[0][0][0], cube[1][0][0]); swap(cube[0][0][2], cube[1][0][2]);
        swap(cube[0][0][1], cube[3][0][1]);
        swap(cube[0][0][1], cube[2][0][1]);
        swap(cube[0][0][1], cube[1][0][1]);
    }
}

int ans[10][2], cnt;

void print() {
    for(int i = 0; i < 6; ++i) {
        for(int j = 0; j < 3; ++j) {
            for(int k = 0; k < 3; ++k) cout << cube[i][j][k] << " ";
            cout << endl;
        }
        cout << endl;
    }
}

bool dfs(int dep, int step) {
    if(check()) return true;
    if(step == dep) return false;

    for(int i = 0; i < 6; ++i) {
        ans[cnt][0] = i; ans[cnt][1] = -1;
        cnt++; solve(i, -1);
        if(dfs(dep, step+1)) return true;
        cnt--; solve(i, 1);

        ans[cnt][0] = i; ans[cnt][1] = 1;
        cnt++; solve(i, 1);
        if(dfs(dep, step+1)) return true;
        cnt--; solve(i, -1);
    }
    return false;
}

int main(void)
{
    int T;
    scanf("%d", &T);
    while(T--) {
        int r = 0, c = 0;
        while(r < 2 || c < 3) {
            char ch = getchar();
            if(c == 3) {
                c = 0; r++;
            }
            if(ch >= 'a' && ch <= 'z') cube[4][r][c++] = ch-'a';
        }
        r = 0; c = 0;
        while(r < 2 || c < 12) {
            char ch = getchar();
            if(c == 12) {
                c = 0; r++;
            }
            if(ch < 'a' || ch > 'z') continue;
            if(c < 3) cube[0][r][c] = ch-'a';
            else if(c < 6) cube[1][r][c-3] = ch-'a';
            else if(c < 9) cube[2][r][c-6] = ch-'a';
            else cube[3][r][c-9] = ch-'a';
            c++;
        }
        r = 0; c = 0;
        while(r < 2 || c < 3) {
            char ch = getchar();
            if(c == 3) {
                c = 0; r++;
            }
            if(ch >= 'a' && ch <= 'z') cube[5][r][c++] = ch-'a';
        }
      //  print();
        cnt = 0; bool ok = false;

        for(int dep = 1; dep <= 5; ++dep) {
            if(dfs(dep, 0)) {
                ok = true; break;
            }
        }
        if(!ok) printf("-1\n");
        else {
            printf("%d\n", cnt);
            for(int i = 0; i < cnt; ++i) printf("%d %d\n", ans[i][0], ans[i][1]);
        }
    }
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值