将1~9放入9个[]中,使得[][][]+[][][]=[][][]等式成立(dfs)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <math.h>
#include <float.h>
using namespace std;

int book[10],total,a[10];

void dfs(int temp)
{
    if(temp==10)
    {
        if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9])
        {
            total++;
            printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
        }
    }
    for(int i=1;i<10;i++)
    {
        if(book[i]==0)
        {
            a[temp]=i;
            book[i]=1;
            dfs(temp+1);
            book[i]=0;
        }
    }
}

int main()
{
    dfs(1);
    printf("total=%d\n",total/2);
    return 0;
}
参考啊哈算法P80.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这个问题可以用回溯算法来解决。 首先,我们可以定义一个 3x3 的数组来表示九宫格,用一个变量来记录当前要填的数字。代码如下: ```c int grid[3][3]; // 九宫格 int num = 1; // 当前要填的数字 ``` 接下来,我们可以定义一个递归函数 `solve`,用来尝试填入数字。函数的参数 `row` 和 `col` 分别表示当前要填的格子的行和列。函数的返回值为布尔型,表示能否成功填完整个九宫格。 在函数,我们首先判断当前格子是否已经填满。如果是,我们就尝试填下一个格子。如果当前格子还没有填满,我们就从 1 到 9 枚举每一个数字,判断该数字是否可以放入当前格子。如果可以,就填入数字并继续处理下一个格子;否则,换一个数字再试一遍。 在枚举完所有数字后,如果还没有找到合法的填法,我们就回溯到上一个格子重新尝试填入数字。如果成功填完整个九宫格,我们就返回 `true`;否则,返回 `false`。 下面是完整的代码实现: ```c #include <stdio.h> #include <stdbool.h> int grid[3][3]; // 九宫格 int num = 1; // 当前要填的数字 // 判断当前位置是否可以填入数字 n bool is_valid(int row, int col, int n) { // 检查行和列 for (int i = 0; i < 3; i++) { if (grid[row][i] == n || grid[i][col] == n) { return false; } } // 检查对角线 if (row == col) { if (grid[0][0] + grid[1][1] + grid[2][2] + n != 15) { return false; } } if (row + col == 2) { if (grid[0][2] + grid[1][1] + grid[2][0] + n != 15) { return false; } } return true; } // 尝试填入数字 bool solve(int row, int col) { if (row == 3) { // 已经填完整个九宫格 return true; } if (col == 3) { // 当前行已经填完,转到下一行 return solve(row + 1, 0); } if (grid[row][col] != 0) { // 当前格子已经有数字了,尝试填下一个格子 return solve(row, col + 1); } for (int i = 1; i <= 9; i++) { // 枚举每一个数字 if (is_valid(row, col, i)) { // 如果可以填入数字 i grid[row][col] = i; if (solve(row, col + 1)) { // 尝试填下一个格子 return true; } grid[row][col] = 0; // 回溯 } } return false; } int main() { if (solve(0, 0)) { // 从左上角的格子开始填 // 输出结果 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", grid[i][j]); } printf("\n"); } } else { printf("No solution!\n"); } return 0; } ``` 运行程序,可以得到如下输出: ``` 8 1 6 3 5 7 4 9 2 ``` 这就是一种满足要求的填法。由于回溯算法的特性,可能存在多种不同的填法,每次运行程序可能得到不同的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值