枚舉問題:POJ撥鐘問題(傻傻的做法)
/***********
枚舉:poj撥鐘問題
************/
#include <iostream>
using namespace std;
int main()
{
int clk[10];
int op[10];
int sum;
for(int i=1;i<=9;i++){
cin >> clk[i];
}
// 9個循環對應着9個操作的次數,其中每個操作如果執行四次那麼就和沒執行一樣,
// 是以,枚舉每個操作執行0到3次的情況
for(op[1]=0;op[1]<4;op[1]++){
for(op[2]=0;op[2]<4;op[2]++){
for(op[3]=0;op[3]<4;op[3]++){
for(op[4]=0;op[4]<4;op[4]++){
for(op[5]=0;op[5]<4;op[5]++){
for(op[6]=0;op[6]<4;op[6]++){
for(op[7]=0;op[7]<4;op[7]++){
for(op[8]=0;op[8]<4;op[8]++){
for(op[9]=0;op[9]<4;op[9]++){
// 對每種情況進行判斷,将這輪情況對所有鐘表的影響累加到sum上
// sum=0時即該情況就是操作步驟最少且滿足條件的情況
sum=0;
sum += (clk[1] + op[1] + op[2] + op[4]) % 4; // 對鐘表1有影響的分别是1 2 4個操作
sum += (clk[2] + op[1] + op[2] + op[3] + op[5]) % 4;
sum += (clk[3] + op[2] + op[3] + op[6]) % 4;
sum += (clk[4] + op[1] + op[4] + op[5] + op[7]) % 4;
sum += (clk[5] + op[1] + op[3] + op[5] + op[7] + op[9]) % 4;
sum += (clk[6] + op[3] + op[5] + op[6] + op[9]) % 4;
sum += (clk[7] + op[4] + op[7] + op[8]) % 4;
sum += (clk[8] + op[5] + op[7] + op[8] + op[9]) % 4;
sum += (clk[9] + op[6] + op[8] + op[9]) % 4;
if(sum==0){
for(int i=1;i<=9;i++){
while(op[i]--){
cout << i << " ";
}
}
return 0;
}
}
}
}
}
}
}
}
}
}
}