Sicily-1050 深度优先搜索

一.      题意

给出5个数和4则运算,看能不能算出目标值出来,如果算不出来就算出比目标值小的最大值。深搜:每一步选两个数做运算,然后算出的结果作为下一步的其中一个操作数。每一步选数有C(5,2)种,每两个数间又有5种运算结果(减法位置不同算两种)。

二.      做法:

用数组存储放进来的5各操作数,并在这个过程中用来存放中间答案,没进行一次计算操作数的个数就会减少一个。注意每一步深搜之后都要恢复原本状态。

三.      源码

 1 //
 2 //  main.cpp
 3 //  sicily-1050
 4 //
 5 //  Created by ashley on 14-10-10.
 6 //  Copyright (c) 2014年 ashley. All rights reserved.
 7 //
 8
 9 #include <iostream>
10 using namespace std;
11 int storing[5];
12 int answer, result;
13 void depthSearch(int size)
14 {
15     for (int i = 0; i < size; i++) {
16         if (storing[i] > result && storing[i] <= answer) {
17             result = storing[i];
18         }
19     }
20     if (result == answer) {
21         return;
22     }
23     if (size == 1) {
24         return;
25     }
26     for (int i = 0; i < size - 1; i++) {
27         for (int j = i + 1; j < size; j++) {
28             int left, right;
29             left = storing[i];
30             right = storing[j];
31             storing[j] = storing[size - 1];
32             //add and decrease a number
33             storing[i] = left + right;
34             depthSearch(size - 1);
35             //subtract and decrease a number
36             storing[i] = left - right;
37             depthSearch(size - 1);
38             //subtract and decrease a number
39             storing[i] = right - left;
40             depthSearch(size - 1);
41             //multiply and decrease a number
42             storing[i] = left * right;
43             depthSearch(size - 1);
44             //divide and decrease a number
45             if (left != 0 && right % left == 0) {
46                 storing[i] = right / left;
47                 depthSearch(size - 1);
48             }
49             if (right != 0 && left % right == 0) {
50                 storing[i] = left / right;
51                 depthSearch(size - 1);
52             }
53             storing[i] = left;
54             storing[j] = right;
55         }
56     }
57 }
58 int main(int argc, const char * argv[])
59 {
60     int runs;
61     cin >> runs;
62     while (runs--) {
63         for (int i = 0; i < 5; i++) {
64             cin >> storing[i];
65         }
66         cin >> answer;
67         result = -101;
68         depthSearch(5);
69         cout << result << endl;
70     }
71     return 0;
72 }
时间: 2024-08-24 07:18:28

Sicily-1050 深度优先搜索的相关文章

sicily 1050 深度优先搜索解题

1050. Numbers & Letters Constraints Time Limit: 3 secs, Memory Limit: 32 MB Description In the early 80’s, a popular TV show on Dutch television was ‘Cijfers en Letters’ (Numbers and Letters). This game consisted of two game elements, in which the ma

sicily 1024 邻接矩阵与深度优先搜索解题

Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. One road only connects two cities. One day, The king of magic-island want to visit the island from the capital. No road is visited twice. Do you know

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

深度优先搜索与广度优先搜索算法理解

深度优先搜索算法和广度优先搜索算法是图论中两个有意思也很实用的算法,下面我们来看看这两个算法. 严书中,给出的利用深度优先搜索(Deep First Search)算法进行图的遍历伪码如下 1 Boolean visited[MAX]; //标志数组 2 Status (*VisitFunction)(int v); //访问函数 3 4 void DFSTraverse(Graph G, Status (*Visit)(int v)) 5 { 6 VisitFunction = Visit;

图论 深度优先搜索 广度优先搜索的非递归实现

深度优先遍历 1.深度优先遍历的递归定义 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过:然后依次从v出发搜索v的每个邻接点w.若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止.若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止. 图的深度优先遍历类似于树的

深度优先搜索

在图中的深度优先搜索,由于避免回路的产生,设置visit数组. 有两种深度优先的应用场景.一种是用于最优解的寻找,即到达目的地的最优解.这时需要设置全局的一个数组,还有变量,来储存路径.通过与别的方法的比较,获取最优解. 第二种是染色问题,只要求全部遍历,没有最优的要求. 还有哈希的用法.当需要记录拥有共同数字特征的一些属性时,就可以使用哈希数组.使用时按照属性的含义寻找.如二叉树某层的数量.

深度优先搜索(dfs)

关于深度优先搜索的总结: 1 dfs 的基本结构:  void dfs(int x){ if( x 超出边界){ return ; }else{ for(遍历){ if(未访问过){ 访问         ; 打上标记    ; dfs(x + 1) ; 去掉标记    ; //极易忘记 } } } return; } 2 用dfs求全排列: 本来好好的,结果sizeof(pointer) 就完蛋了.神秘的内存错误,而且还能正常的跑出一个不正常的结果出来. 想了解sizeof这个小妖精的看这里

深度优先搜索思想初体验

1.求数字 1~n 的全排列 import java.util.Scanner ; public class Permutation{ //求数字 1~n 的全排列: int[] array ; int[] book ; int n ; public void permutation(int step){ // 深度优先搜索思想: if (step==n+1) { for (int i=1;i<=n;i++) { System.out.print(array[i] + " ")

深度优先搜索(DFS)

定义: (维基百科:https://en.wikipedia.org/wiki/Depth-first_search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止(属于盲目搜索). 基