poj1166

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

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

poj1166
#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

 

你可能感兴趣的:(poj)