题目:http://poj.org/problem?id=1166
题意:给出9个时钟的状态和9种操作,每种操作可以改变不同的时钟的状态,每次只能改变90度,输出最少的有序的操作序列 思路:枚举出每种操作的次数,最多为3次,保存在num数组中,判断每个时钟经过9种,每种num[j]次操作,是否为0.#include <stdio.h> #include <string.h> int flag; int state[9], num[9]; int change[9][9]={{1, 1, 0, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 1, 1, 0, 0, 0}, {1, 0, 0, 1 ,0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 1, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 1, 1, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 1, 1, 0, 1, 1}}; //9种操作,change[i][j]==1 表示第i种操作可以改变第j个时钟的状态。 int judge() { for (int i=0; i<9; i++)//9个时钟 { int tem=state[i]; for (int j=0; j<9; j++) //9种操作 { for (int k=0; k<num[j]; k++) //每种操作的次数 { tem=(tem+change[j][i])%4; } } if (tem) return 0; } return 1; } void dfs(int x) { if (x>9) return; if (judge()) { flag=1; for (int i=0; i<9; i++) { for (int j=0; j<num[i]; j++) printf("%d ", i+1); } printf("\n"); return; } for (int i=0; i<=3; i++) { num[x]=i; dfs(x+1); if (flag) return; } } int main() { //freopen("in.txt", "r", stdin); for (int i=0; i<9; i++) scanf("%d", &state[i]); memset(num, 0, sizeof(num)); flag=0; dfs(0); return 0; }