Sicily 1153: 马的周游问题(DFS+剪枝)
这道题没有找到一条回路,所以不能跟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+剪枝)相关推荐
- 骑士周游(dfs+greedy)
骑士周游(DFS+Greedy): 提示:马踏棋盘问题 也称 骑士周游问题 记录一道dfs+greedy的题目, 这道题能够帮助我们更好的理解dfs中的优化问题 题目描述: 提示:马踏棋盘问题(骑士周 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- 【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 ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- poj2248 DFS+剪枝 or BFS
传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...
- 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)
题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...
- DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山
DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...
最新文章
- Go modules基础精进,六大核心概念全解析(下)
- gorm软删除_gorm踩坑:软删除与某个字段的唯一性
- 计算机视觉基础:图像处理(上)
- sql 中的导航函数 FIRST_VALUE, LAST_VALUE
- 如何在JavaServer Pages中使用Salesforce REST API
- 哈哈哈哈哈!“科研打工人”的凡尔赛
- 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵
- FreeRTOS内核实现06:任务延时列表
- ViewDidLoad运行多次的问题
- 【慢慢学算法】:八进制(vector练习)
- 中国计算机学会 (China Computer Federation,CCF) 推荐中文科技期刊目录 - 2019
- Eclipse 9.x 10.0 之破解详细步骤
- 小白网安学习日记(2) hacknet游戏(模拟黑客入侵的游戏)
- 高山仰止,景行行止,虽不能至,心向往之!软工大二狗的回顾与展望。
- 用于理解C++类中静态成员的单子模式研究
- 京东Java后台开发岗社招面试经验分享,4面的面经
- 不经一番寒彻骨,怎得梅花扑鼻香,墙都不扶就服你
- oracle ebs 安装教程,Oracle EBS R12.1.1 安装及配置
- 分类classify
- 合路器Combiner Multiplexer