poj1166

爆搜就可以过,不过我用了迭代加深。

注意每个操作最多进行4次

#include <cstdio>
#include <cstdlib>
using namespace std;

#define MAX_ANS 100

int clock[9];
char move[9][10] = {"ABDE", "ABC", "BCEF", "ADG", "BDEFH", "CFI", "DEGH", "GHI", "EFHI"};
int ans[MAX_ANS], ans_num;

void input()
{
    for (int i = 0; i < 9; i++)
        scanf("%d", &clock[i]);
}

void output()
{
    printf("%d", ans[0]);
    for (int i = 1; i < ans_num; i++)
        printf(" %d", ans[i]);
    putchar('\n');
}

bool ok()
{
    for (int i = 0; i < 9; i++)
        if (clock[i])
            return false;
    return true;
}

void make(char* move, int value)
{
    for (int i = 0; move[i]; i++)
    {
        int index = move[i] - 'A';
        clock[index] = (clock[index] + value + 4) % 4;
    }
}

void dfs(int step, int limit, int move_index)
{
    if (step > limit)
        return;
    if (ok())
    {
        output();
        exit(0);
    }
    for (int i = move_index; i < 9; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            make(move[i], 1);
            ans[ans_num++] = i + 1;
            dfs(step + 1, limit, i + 1);
        }
        ans_num -= 3;
        make(move[i], -3);
    }
}

int main()
{
    input();
    for (int i = 0; i < 100; i++)
    {
        ans_num = 0;
        dfs(0, i, 0);
    }
    return 0;
}
View Code

 

posted @ 2013-12-28 14:17  金海峰  阅读(459)  评论(0编辑  收藏  举报