题意:
给出9【A-I】个表,9中操作,每种操作只能拨动部分表,
Move Affected clocks
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
问,最少几步把表都拨到12点?
分析:
这个题每种拨法不能超过4次,这就类似翻转棋子了,4次就回到了原来的地方,没必要。所以,那问题就简化很多了,每种操作不多于3次。那如何选择最短路呢?因为这些顺序是无关的,先执行哪个动作都可以,所以顺序是可以随便写的。改变顺序不影响结果。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 1000
using namespace std;
int mp[maxn];
int main()
{
// read;
int i,j;
for(i=1;i<=9;i++)cin>>mp[i];
int i1,i2,i3,i4,i5,i6,i7,i8,i9;
for(i2=0;i2<4;i2++)
for(i1=0;i1<4;i1++)
for(i3=0;i3<4;i3++)
for(i4=0;i4<4;i4++)
for(i5=0;i5<4;i5++)
for(i6=0;i6<4;i6++)
for(i7=0;i7<4;i7++)
for(i8=0;i8<4;i8++)
for(i9=0;i9<4;i9++)
{
int tmp1=(mp[1]+i1+i2+i4)%4;
int tmp2=(mp[2]+i1+i2+i3+i5)%4;
int tmp3=(mp[3]+i2+i3+i6)%4;
int tmp4=(mp[4]+i1+i4+i5+i7)%4;
int tmp5=(mp[5]+i1+i3+i5+i7+i9)%4;
int tmp6=(mp[6]+i3+i5+i6+i9)%4;
int tmp7=(mp[7]+i4+i7+i8)%4;
int tmp8=(mp[8]+i5+i7+i8+i9)%4;
int tmp9=(mp[9]+i6+i8+i9)%4;
if(tmp1==0 && tmp2==0 && tmp3==0 && tmp4==0 && tmp5==0 && tmp6==0
&& tmp7==0 && tmp8==0 && tmp9==0)
{
for(int k1=0;k1<i1;k1++)cout<<"1 ";
for(int k2=0;k2<i2;k2++)cout<<"2 ";
for(int k3=0;k3<i3;k3++)cout<<"3 ";
for(int k4=0;k4<i4;k4++)cout<<"4 ";
for(int k5=0;k5<i5;k5++)cout<<"5 ";
for(int k6=0;k6<i6;k6++)cout<<"6 ";
for(int k7=0;k7<i7;k7++)cout<<"7 ";
for(int k8=0;k8<i8;k8++)cout<<"8 ";
for(int k9=0;k9<i9;k9++)cout<<"9 ";
cout<<endl;
return 0;
}
}
}
时间: 2024-12-18 18:43:32