蓝桥杯 六角填数(dfs || 暴力枚举)

六角填数 
如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?


题目分析:第一思路是万能的枚举,stl的next_permutation真的是太太太好用了,贴代码。当然为了学习,我们不能总是用如此投机取巧的办法,所以我仍然写了一份dfs的方法。两个方法,我都自己把上面的格子写成了一个数组,并且加了下标。

答案是10;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int vis[20];
int a[20];
int ans = 0;

bool judge()
{
	int t1 = a[1]+a[3]+a[6]+a[8];
	int t2 = a[1]+a[4]+a[7]+a[11];
	int t3 = a[8]+a[9]+a[10]+a[11];
	int t4 = a[2]+a[3]+a[4]+a[5];
	int t5 = a[2]+a[6]+a[9]+a[12];
	int t6 = a[5]+a[7]+a[10]+a[12];
	
	if(t1==t2&&t1==t3&&t1==t4&&t1==t5&&t1==t6)
		return true;
	return false;
}
//void dfs(int x)
//{
//	
//		
//}
int main()
{
	for(int i = 1; i<= 12; i++)
		a[i] = i;
	do{
		if(judge() == true && a[1] == 1 && a[2] == 8&&a[12] == 3)
		{
			cout<<a[6]<<endl;
			break;
		}
	

	}while(next_permutation(a+1,a+13));

	return 0;
 }  

下面是dfs的代码。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int vis[20];
int a[20];
int ans = 0;

bool judge()
{
	int t1 = a[1]+a[3]+a[6]+a[8];
	int t2 = a[1]+a[4]+a[7]+a[11];
	int t3 = a[8]+a[9]+a[10]+a[11];
	int t4 = a[2]+a[3]+a[4]+a[5];
	int t5 = a[2]+a[6]+a[9]+a[12];
	int t6 = a[5]+a[7]+a[10]+a[12];
	
	if(t1==t2&&t1==t3&&t1==t4&&t1==t5&&t1==t6)
		return true;
	return false;
}
void dfs(int x)
{
	if(x > 11)
	{
			if(judge() == true)
				cout<<a[6]<<endl;
			return ;
	}
	for(int i = 2; i <= 12; i++)
	{
		if(!vis[i])
		{
			a[x] = i;
			vis[i] = 1;
			dfs(x+1);
			vis[i] = 0;
		}
	}
}
int main()
{
	for(int i = 1; i<= 12; i++)
		a[i] = i;
	
	a[1] = 1;
	a[2] = 8;
	a[12] = 3;
	
	memset(vis,0,sizeof(vis));
	vis[1] = vis[8] = vis[3] = 1;
	
	dfs(3);
	return 0;
 } 

### 蓝桥杯 DFS 算法 示例 解题思路 #### 关于DFS的重要性 在蓝桥杯等编程竞赛中,DFS(深度优先搜索)是一种极为重要的算法工具。通过使用DFS或BFS的暴力枚举方式,参赛者通常能够获得一定比例的基础分[^1]。 #### 题目分类与解题思路 蓝桥杯中的DFS题目主要分为两类: 1. **针对分配过程的DFS** 这类问题涉及资源分配、路径规划等问题,常需设计递归函来模拟可能的状态转移。例如,“飞机降落”这道题目属于此类问题,其核心在于合理定义状态空间并利用回溯技术完成遍历[^2]。 2. **图/树结构上的DFS** 此类问题是经典的图论应用,要求选手熟悉节点访问标记机制以及如何处理连通性和可达性分析。这类题目往往具有较高的重复度,适合套用模板解决。 #### 经典例题解析——九宫幻方 以“九宫幻方”为例说明具体实现方法。该问题的目标是在给定条件下排列字形成满足特定条件的矩阵形式。以下是基于DFS求解此问题的一个Python代码片段: ```python def dfs(pos, used, grid): if pos == 9: # 如果满了整个网格 return check(grid) # 检查当前布局是否合法 for num in range(1, 10): # 尝试充每一个可用 if not (used >> num) & 1: # 判断这个是否已经被使用过 row, col = divmod(pos, 3) grid[row][col] = num if valid(row, col, grid): # 当前位置放置num后仍保持合法性 res = dfs(pos + 1, used | (1 << num), grid) if res: return True grid[row][col] = 0 # 回退操作 return False # 辅助判断当前位置是否有效 def valid(r, c, g): s = sum(g[r]) + sum([g[i][c] for i in range(3)]) - g[r][c] diag_sum_1 = sum(g[i][i] for i in range(3)) if r == c else float('inf') diag_sum_2 = sum(g[i][2-i] for i in range(3)) if r+c==2 else float('inf') return all(x != 15 or x == float('inf') for x in [s, diag_sum_1, diag_sum_2]) grid = [[0]*3 for _ in range(3)] if dfs(0, 0, grid): print("Solution found:", grid) else: print("No solution.") ``` 上述程序展示了如何运用DFS逐步尝试各种可能性直至找到符合条件的结果集[^3]。 #### 另一实例探讨——扫雷游戏逻辑优化 对于更复杂的场景比如“扫雷”,虽然存在多种可行方案,但在严格测试环境下仅有部分高效策略才能完全适应不同评测标准的要求。下面展示了一个经过精细调整后的C++版解决方案概览: ```cpp #include <bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; vector<string> mine(n); for(auto& str : mine){ cin>>str; } auto count_mines=[&](const pair<int,int>& p)->int{ static const array<pair<int,int>,8> dirs={ {-1,-1},{-1,0},{-1,+1}, {0 ,-1}, /*p*/{0 ,+1}, {+1,-1},{+1,0},{+1,+1} }; int cnt=0,x=p.first,y=p.second; for(const auto &[dx,dy]:dirs){ int nx=x+dx,ny=y+dy; if(nx>=0 && ny>=0 && nx<n && ny<m && mine[nx][ny]=='*'){ ++cnt; } } return cnt; }; string ans="Possible"; bool ok=true; // ...其余省略... } // 更多细节参见实际提交记录验证情况下的完整脚本文件内容。 ``` 尽管如此,在某些特殊情况下其他变体也可能表现良好;然而需要注意的是这些替代途径未必总能在所有场合下维持一致性效果[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值