• HDU2234 无题I 题解 迭代加深搜索


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234

    题目大意:

    一天机器人小A在玩一个简单的智力游戏,这个游戏是这样的,在一个4*4的矩阵中分别有4个1,4个2,4个3和4个4分别表示4种不同的东西,每一步小A可以把同一行的4个数往左移或者往右移一步或者把同一列的4个数字往上移或者往下移一步(1,2,3,4往左移后是2,3,4,1),小A现在想知道进过最少的几步移动可以将矩阵的每行上的4个数字都一样或者每列上的4个数字都一样。但是小A又不想走太多步,他只要知道最少步数是否少于等于5步,是的话输出准确的步数,否则输出-1。

    解题思路:迭代加深搜索。

    示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    int a[4][4];
    void l_rot(int r) {
        int t = a[r][0];
        a[r][0] = a[r][1];
        a[r][1] = a[r][2];
        a[r][2] = a[r][3];
        a[r][3] = t;
    }
    void r_rot(int r) {
        int t = a[r][3];
        a[r][3] = a[r][2];
        a[r][2] = a[r][1];
        a[r][1] = a[r][0];
        a[r][0] = t;
    }
    void u_rot(int c) {
        int t = a[0][c];
        a[0][c] = a[1][c];
        a[1][c] = a[2][c];
        a[2][c] = a[3][c];
        a[3][c] = t;
    }
    void d_rot(int c) {
        int t = a[3][c];
        a[3][c] = a[2][c];
        a[2][c] = a[1][c];
        a[1][c] = a[0][c];
        a[0][c] = t;
    }
    bool chk_r(int r) {
        for (int i = 1; i < 4; i ++) if (a[r][0] != a[r][i]) return false;
        return true;
    }
    bool chk_c(int c) {
        for (int i = 1; i < 4; i ++) if (a[0][c] != a[i][c]) return false;
        return true;
    }
    bool check() {
        return chk_r(0) && chk_r(1) && chk_r(2) && chk_r(3) || chk_c(0) && chk_c(1) && chk_c(2) && chk_c(3);
    }
    int D;
    bool dfs(int d) {
        if (d >= D) {
            return check();
        }
        for (int i = 0; i < 4; i ++) {
            l_rot(i);
            if (dfs(d+1)) return true;
            r_rot(i);
            r_rot(i);
            if (dfs(d+1)) return true;
            l_rot(i);
            u_rot(i);
            if (dfs(d+1)) return true;
            d_rot(i);
            d_rot(i);
            if (dfs(d+1)) return true;
            u_rot(i);
        }
        return false;
    }
    int solve() {
        for (D = 0; D <= 5; D ++) {
            if (dfs(0)) return D;
        }
        return -1;
    }
    int T;
    int main() {
        scanf("%d", &T);
        while (T --) {
            for (int i = 0; i < 4; i ++) for (int j = 0; j < 4; j ++) scanf("%d", &a[i][j]);
            printf("%d
    ", solve());
        }
        return 0;
    }
    
  • 相关阅读:
    facedetect
    gmm
    拉格朗日对偶
    基于 MeanShift 算法的目标跟踪问题研究
    视频目标跟踪算法综述
    AtCoder Beginner Contest 088 C Takahashi's Information
    L3-016. 二叉搜索树的结构
    垒骰子
    1130. Infix Expression (25)
    1129. Recommendation System (25)
  • 原文地址:https://www.cnblogs.com/quanjun/p/13746808.html
Copyright © 2020-2023  润新知