Sicily-1152 回溯算法

一.题意:

走日字,每个位置都有有8种新位置,从起点开始刚好过29步遍历其他位置一遍。

二.代码

 1 //
 2 //  main.cpp
 3 //  Sicily-1152 回溯算法
 4 //
 5 //  Created by ashley on 14-10-21.
 6 //  Copyright (c) 2014年 ashley. All rights reserved.
 7 //
 8
 9 #include <iostream>
10 #include <utility>
11 using namespace std;
12
13 //pair<int, int> moves[8] = {(1, 2), (2, 1), (2, -1), (1, -2), (-1, -2), (-2, -1), (-2, 1), (-1, 2)};
14 int moveX[8] = {1, 2, 2, 1, -1, -2, -2, -1};
15 int moveY[8] = {2, 1, -1, -2, -2, -1, 1, 2};
16 bool isVisited[30];
17 int path[30];
18 int counter;
19 bool success;
20 typedef struct
21 {
22     int x;
23     int y;
24 }point;
25 void dfs(point startPoint)
26 {
27     if (counter == 30) {
28         success = true;
29         cout << path[0];
30         for (int i = 1; i < 30; i++) {
31             cout << " " << path[i];
32         }
33         cout << endl;
34         return;
35     }
36     for (int i = 0; i < 8; i++) {
37         point nextPoint = {startPoint.x + moveX[i], startPoint.y + moveY[i]};
38         int num = nextPoint.y * 6 + nextPoint.x + 1;
39         if (nextPoint.x < 6 && nextPoint.x >= 0 && nextPoint.y < 5 && nextPoint.y >= 0 && isVisited[num - 1] == false) {
40             isVisited[num - 1] = true;
41             path[counter] = num;
42             counter++;
43             if (success) {
44                 return;
45             }
46             dfs(nextPoint);
47             isVisited[num - 1] = false;
48             counter--;
49         }
50     }
51 }
52 int main(int argc, const char * argv[])
53 {
54     int source;
55     while (cin >> source) {
56         if (source == -1) {
57             break;
58         }
59         point sourcePoint = {source % 6 - 1, source / 6};
60         for (int i = 0; i < 30; i++) {
61             isVisited[i] = false;
62         }
63         success = false;
64         counter = 1;
65         //源点只能走一次
66         isVisited[source - 1] = true;
67         path[counter - 1] = source;
68         dfs(sourcePoint);
69     }
70     return 0;
71 }
时间: 2024-08-04 00:21:15

Sicily-1152 回溯算法的相关文章

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

数据结构之回溯算法

借鉴:http://blog.csdn.net/baple/article/details/7181404 package database; public class NQuee { public static boolean Verify(int arr[],int i){                              //仅仅判断能不能放置这个皇后        for(int k =1;k != i;k++)                                  

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

回溯算法之素数环

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// <ather> /// lihonglin /// </ather> /// <content> /// 把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. ///分析:用回溯算法,考察所有

计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)

实验课安排 地点: 科技楼423 时间:  计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家. 实验内容 (1)八皇后及N皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一行.同一列或同一斜线上.问有多少种摆法. 高斯觉得有76种方案.1

DFS ( 深度优先/回溯算法 ) 一

    深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点.整个进程反复进行直到所有节点都被访问为止.属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n).(Wiki) DFS在搜索过程常常伴随许多优化策略,增加剪枝函数,或者和动态规划结合. 让我们用一道看似简单的例子理解DFS. = = /

c语言数据结构:递归的替代-------回溯算法

1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未执行的操作. 2.贴代码表现: 先序遍历二叉树: BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) retu

回溯算法——算法总结(四)

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯算法解决这个问题的一般步骤为: 1.定义一个解空间.它包括问题的解. 2.利用适于搜索的方法组织解空间. 3.利用深度优先法搜索解空间. 4.利用限界函数避免移动到不可能产生解的子空间. 问题的解空间一般是在搜索问题的解的过程中动态产生的.这是回溯算法的一个重要特性. 经典样例(N后问题): 要求在一个n*n格的棋盘上放置n个皇后,使得她们彼此不受攻击,即使得