1213 The Clocks

本文详细解析了一道关于位进制搜索的编程问题,重点在于暴力搜索策略。代码展示了如何使用深度优先搜索(DFS)解决这个问题,通过遍历和更新状态数组,寻找符合条件的解。在搜索过程中,涉及到了方位数组的概念,帮助理解题目逻辑。虽然搜索过程复杂,但代码实现简洁高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值