1213 The Clocks
位进制搜索,比较难,代码量通常会很少
不过我貌似看了好长时间都不理解是什么意思
这个题呢,他的精髓就在于暴力搜索,他的思路大部分都是如此,比较难,代码往往会很长
其实搜索就是一个枚举的过程,通常在搜索中都会涉及到方位数组,这个东西大家都很熟悉了,方位数组在这个题里就很类似了
#include<iostream>
#define M 9//3*3
using namespace std;
int node[M][M]={//打表作为移动的方式
{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}
};
int a[M],c[M],f[M];
void dfs(int x)
{
bool ok=1;//判断标记
for(int i=0;i<M;i++)
f[i]=a[i];//复制一份
for(int i=0;i<M;i++)
for(int j=0;j<M;j++)
f[i]=(f[i]+node[j][i]*c[j])%4;//循环取数
for(int i=0;i<M;i++)//全是12个点
{
if(f[i]>0)
{
ok=0;
break;
}
}
if(ok)//符合条件
{
for(int i=0;i<M;i++)
for(int j=0;j<c[i];j++)
cout<<i+1<<" ";//输出答案
cout<<endl;
x=9;//变为边界数,结束搜索
}
if(x==M)
return;//搜索到边界
for(int i=0;i<4;i++)//否咋继续搜索下一行
{
c[x]=i;
dfs(x+1);
}
}
int main()
{
for(int i=0;i<M;i++)
{
cin>>a[i];
a[i]=a[i]/3%4;//用0-4之间的数来表示3、6、9、12
}
dfs(0);//开始深搜
return 0;
}