题目: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; }

本文详细介绍了如何通过枚举和判断操作序列,解决POJ平台上的1166题,即求解最少操作序列以使所有时钟状态为0。文中涉及的主要算法为深度优先搜索(DFS),并使用了状态数组和操作矩阵来辅助求解。
750

被折叠的 条评论
为什么被折叠?



