PKU 1166 The Clocks

来源:互联网 发布:大唐天下网络骗局 编辑:程序博客网 时间:2024/05/16 15:54
题目: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;}