【深搜】和为零

该博客介绍了如何利用深度搜索(DFS)算法解决一个数学问题:在1到N的递增数列中插入加号、减号或空格,使得表达式结果和为零。博客提供了具体的输入输出示例、解题思路和程序运行结果,重点在于深度搜索的实现和递归验证条件的设定。

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

题目描述

请考虑一个由1到N(N=3, 4, 5 … 9)的数字组成的递增数列:1 2 3 … N。 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。 计算该表达式的结果并注意你是否得到了和为零。 请你写一个程序找出所有产生和为零的长度为N的数列。

输入

单独的一行表示整数N (3 <= N <= 9)。

输出

按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)

样例输入

7

样例输出

1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7

解题思路:

可以使用深搜,不断枚举三种符号 ‘+’ ‘-’ ’ ’ 三种情况,并验证和为零。然后设置三个参数DFS(pos,sum,num),

pos指的是当前位置,sum为整个算式的和,num为当前数。

题解:

#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;

char s[20]; 
int n;

void DFS(int pos,int sum,int num) 
//三个参数分别表示:当前位置,不含当前位置的和,当前位置上的数 
{
    int i;
    
    if(pos==n)
    {
        if(sum+num==0)
        
### 三级标题:炸弹人游戏中的度优先索(DFS)实现 在炸弹人游戏中,目标是找到一个空地作为炸弹的安放点,使得该位置能够消灭最多的敌人。由于炸弹的威力不能穿透墙体,因此必须考虑墙体对行列中敌人数量的影响。为了找到最佳位置,可以使用度优先索(DFS)算法来探索所有可达的空地,并统计每个位置所能消灭的敌人总数。 在实现DFS时,从起始坐标出发,访问所有可达的空地。在访问过程中,需要标记已经走过的路径,以避免重复访问或陷入无限循环。与某些最短路径问题不同,这里不需要回溯,因为一旦某个空地被访问过,其最优解(即该位置能消灭的敌人数量)已经被计算,不需要再次访问[^1]。 ### 三级标题:DFS 算法实现 ```c #include <stdio.h> #include <stdlib.h> #define MAXN 5001 int max_kills = 0, mx, my; int book[MAXN][MAXN]; // 标记已访问的位置 char grid[MAXN][MAXN]; // 地图数组 int m, n; // 地图尺寸 // 计算某位置能消灭的敌人数量 int get_kills(int x, int y) { int count = 0; int i; // 向上 for (i = x - 1; i >= 0 && grid[i][y] != '#'; i--) { if (grid[i][y] == 'G') count++; } // 向下 for (i = x + 1; i < n && grid[i][y] != '#'; i++) { if (grid[i][y] == 'G') count++; } // 向左 for (i = y - 1; i >= 0 && grid[x][i] != '#'; i--) { if (grid[x][i] == 'G') count++; } // 向右 for (i = y + 1; i < m && grid[x][i] != '#'; i++) { if (grid[x][i] == 'G') count++; } return count; } // DFS 函数 void dfs(int x, int y) { int next[4][2] = {{x - 1, y}, {x + 1, y}, {x, y - 1}, {x, y + 1}}; // 上下左右四个方向 for (int k = 0; k < 4; k++) { int tx = next[k][0]; int ty = next[k][1]; // 判断边界是否为墙或已访问 if (tx < 0 || tx >= n || ty < 0 || ty >= m) continue; if (grid[tx][ty] == '#' || book[tx][ty]) continue; // 标记为已访问 book[tx][ty] = 1; // 计算当前位置的敌人数量 int current_kills = get_kills(tx, ty); if (current_kills > max_kills) { max_kills = current_kills; mx = tx; my = ty; } // 继续索 dfs(tx, ty); } } ``` ### 三级标题:主函数与输入处理 ```c int main() { int start_x, start_y; scanf("%d %d %d %d", &n, &m, &start_x, &start_y); // 读取地图尺寸起始坐标 for (int i = 0; i < n; i++) { scanf("%s", grid[i]); // 读取地图 } book[start_x][start_y] = 1; // 标记起始位置已访问 max_kills = get_kills(start_x, start_y); // 初始最大消灭敌人数量 mx = start_x; my = start_y; dfs(start_x, start_y); // 开始度优先索 printf("%d %d\n", mx, my); // 输出最佳位置 printf("%d\n", max_kills); // 输出最大消灭敌人数量 return 0; } ``` ### 三级标题:相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值