【枚举】方格填数

这是一个关于使用枚举算法解决特定填数问题的博客。题目要求在8个方格中填入1-8的数字,确保相邻和对角线数字差不为1,并按顺序找出第k种填法。博客提供了输入输出格式和样例,并指出这是典型的枚举算法题目,给出了AC代码。

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

内存限制:128 MiB时间限制:1000 ms标准输入输出

题目描述

如图所示形状的八个方格中填入1-8这八个数字,使得相邻的和对角线上的数字之差不为1,编程求解按照方格顺序从小到大排序后的第k种填法方案。 
 

输入格式

1个整数K,保证有合法输出结果。

输出格式

第k种方案按照方格编号从小到大的顺序输出,中间有1个空格间隔。 

样例

样例输入

1

样例输出

2 5 8 6 3 1 4 7

数据范围与提示

注意对角线要考虑b1和b2,b4之间,b8和b4,b7之间的关系

典型的枚举算法,题目已经提示了您

AC代码:

#include<bits/stdc++.h>//万能头
/*等价于:
#include<algorithm>
#include<iostream>
#include<cmath>*/
using namespace std;//申请标准命名空间
int a[4][8],sum=1,o;//定义变量,o用于输入,sum用于计数求和
void perm(int list[], int k, int m)//用递归算法来计算
{
if(k==m)
{
if(abs(list[1]-list[4])!=1&&abs(list[0]-list[2])!=1&&abs(list[2]-list[5])!=1&&abs(list[5]-list[7])!=1&&abs(list[3]-list[6])!=1&&abs(list[1
枚举法通常用于搜索所有可能的情况,直到找到符合条件的结果。对于这个问题,我们可以尝试将字 1-6 分别赋值给六个方格,然后检查每一对相邻的字之和是否为素。由于有六个字和六个位置,所以可以列出所有可能的顺序组合。 下面是一个简单的C语言程序,使用枚举法暴力搜索解决方案。这个程序并不优雅,但它展示了如何通过遍历所有可能性来找到满足条件的序列: ```c #include <stdio.h> #include <stdbool.h> // 检查是否为素 bool is_prime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true; } // 递归枚举组 void fill_grid(int grid[6], int remaining[], int pos, bool used[]) { // 如果所有字都已入,检查结果 if (pos == 6) { for (int i = 0; i < 5; i++) { if (!is_prime(grid[i] + grid[i+1])) { return; // 如果有一对邻接之和不是素,返回 } } printf("Solution found: "); for (int i = 0; i < 6; i++) { printf("%d ", grid[i]); } printf("\n"); return; } // 尝试剩余入当前位置 for (int i = 0; i < 6 && used[remaining[i]]; i++) { used[remaining[i]] = false; grid[pos] = remaining[i]; fill_grid(grid, remaining, pos + 1, used); used[remaining[i]] = true; // 回溯,尝试下一个字 } } int main() { int grid[6] = {0}; int numbers[] = {1, 2, 3, 4, 5, 6}; bool used[6] = {true, true, true, true, true, true}; fill_grid(grid, numbers, 0, used); return 0; } ``` 这个程序会打印出所有满足条件的序列。请注意,这种方法的时间复杂度非常高,因为需要穷举所有可能的排列,实际应用中可能不适合大规模据。如果需要优化,可以考虑引入一些启发式算法,比如回溯搜索加上剪枝策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值