这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出。我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了move1后下一步有7种方向可以走,而走了move2后有2种方向可以走,那我们就优先走move2,具体实现参考代码:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 int _move[8][2] ={{1, -2}, {2, -1}, {2, 1}, {1, 2},{-1, 2}, {-2, 1}, {-2, -1}, {-1, -2}};
  4
  5
  6 struct Node{
  7     int x, y;
  8     vector<int>path;
  9 };
 10 Node node;
 11 struct Move{
 12     int x, y;
 13     int degree;
 14 };
 15
 16 void getDegree(Move &move){
 17     int ans = 0;
 18     int cur_x = node.x+ move.x;//下一步的位置
 19     int cur_y = node.y + move.y;
 20
 21     for(int i = 0; i < 8; i++){//以cur_x, cur_y为起点,检查其出度
 22
 23         int x = cur_x + _move[i][0];
 24         int y = cur_y + _move[i][1];
 25         if(0 <= x && x < 8 && 0 <= y && y < 8){//如果坐标没有越界并且没有重复走过,则出度加一
 26             int flag = 1;
 27             for(int j = 0; j < node.path.size(); j++){
 28                 if(node.path[j] == x*8 + y){
 29                     flag = 0;
 30                     break;
 31                 }
 32             }
 33
 34             if(flag)ans++;
 35         }
 36
 37     }
 38     move.degree = ans;
 39 }
 40
 41 bool cmp(Move m1, Move m2){
 42     return m1.degree < m2.degree;
 43 }
 44 bool dfs(int x, int y){
 45
 46     node.x = x;
 47     node.y = y;
 48     Move move[8];
 49     for(int i = 0; i < 8; i++){
 50         move[i].x = _move[i][0];
 51         move[i].y = _move[i][1];
 52         if(0 <= node.x + _move[i][0] && node.x + _move[i][0] < 8 &&
 53            0 <= node.y + _move[i][1] && node.y + _move[i][1] < 8)
 54             getDegree(move[i]);    //如果下一步没有越界,则获取它的出度
 55         else move[i].degree = 100; //若下一步越界,出度设为100
 56     }
 57     sort(move, move+8, cmp);//对出度从小到大排序
 58     for(int i = 0; i < 8; i++){
 59             if(move[i].degree == 100) continue;//若出度为100,跳过
 60             int x = node.x + move[i].x;//下一步位置
 61             int y = node.y + move[i].y;
 62             if(0 <= x && x < 8 && 0 <= y && y < 8){
 63                 int flag = 1;
 64                 for(int j = 0; j < node.path.size(); j++){
 65                     if(node.path[j] == x*8 + y){
 66                         flag = 0;
 67                         break;
 68                     }
 69                 }
 70                 if(flag){
 71                     node.path.push_back(x*8 + y);//走下一步
 72
 73                     if(node.path.size() >= 64){//当path的size等于64,则说明已经走遍
 74                         for(int i = 0; i < node.path.size(); i++){
 75                             cout << node.path[i] + 1 << ' ';
 76                         }
 77                         cout << endl;
 78                         return true;
 79                     }
 80                     if(dfs(x, y))return true;
 81                     node.path.pop_back();//还原到原来
 82                     node.x -= move[i].x;
 83                     node.y -= move[i].y;
 84                 }
 85             }
 86
 87     }
 88     return false;
 89 }
 90
 91 int main(){
 92     int n;
 93     while(cin >> n && n != -1){
 94         node.path.clear();
 95         n = n-1;
 96         int a = n / 8;
 97         int b = n % 8;
 98         node.path.push_back(a*8 + b);
 99         dfs(a, b);
100     }
101 } 

转载于:https://www.cnblogs.com/Vincent-Bryan/p/6258788.html

Sicily 1153: 马的周游问题(DFS+剪枝)相关推荐

  1. 骑士周游(dfs+greedy)

    骑士周游(DFS+Greedy): 提示:马踏棋盘问题 也称 骑士周游问题 记录一道dfs+greedy的题目, 这道题能够帮助我们更好的理解dfs中的优化问题 题目描述: 提示:马踏棋盘问题(骑士周 ...

  2. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  3. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  4. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  5. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  6. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  7. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  8. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  9. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

最新文章

  1. Go modules基础精进,六大核心概念全解析(下)
  2. gorm软删除_gorm踩坑:软删除与某个字段的唯一性
  3. 计算机视觉基础:图像处理(上)
  4. sql 中的导航函数 FIRST_VALUE, LAST_VALUE
  5. 如何在JavaServer Pages中使用Salesforce REST API
  6. 哈哈哈哈哈!“科研打工人”的凡尔赛
  7. 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵
  8. FreeRTOS内核实现06:任务延时列表
  9. ViewDidLoad运行多次的问题
  10. 【慢慢学算法】:八进制(vector练习)
  11. 中国计算机学会 (China Computer Federation,CCF) 推荐中文科技期刊目录 - 2019
  12. Eclipse 9.x 10.0 之破解详细步骤
  13. 小白网安学习日记(2) hacknet游戏(模拟黑客入侵的游戏)
  14. 高山仰止,景行行止,虽不能至,心向往之!软工大二狗的回顾与展望。
  15. 用于理解C++类中静态成员的单子模式研究
  16. 京东Java后台开发岗社招面试经验分享,4面的面经
  17. 不经一番寒彻骨,怎得梅花扑鼻香,墙都不扶就服你
  18. oracle ebs 安装教程,Oracle EBS R12.1.1 安装及配置
  19. 分类classify
  20. 合路器Combiner Multiplexer

热门文章

  1. 秋招必考——Batch Normalization精简解析
  2. 人工智能基础-向量的基本几何意义
  3. 人均年薪250万, 拥有400名博士, 这家AI公司去年亏27亿
  4. 不投降就是成功 --- 我看《新喜剧之王》
  5. 如何下载指定版本的torchtext
  6. 不止摩尔定律,计算领域值得学习的定律还有哪些?
  7. 反思脑机接口技术:机器真的能控制我们的大脑吗?
  8. 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
  9. 胡小明:城市大脑与人脑不同的数据意识
  10. 智能制造深度报告发布:工业机器人、视觉与工业物联/互联网新方向