首页 > 代码库 > Sicily 1151: 简单的马周游问题(DFS)

Sicily 1151: 简单的马周游问题(DFS)

  这道题嘛,直接使用DFS搜索,然后莫名其妙地AC了。后来看了题解,说是move的顺序不同的话可能会导致超时,这时便需要剪枝,真是有趣。原来自己是误打误撞AC了,hhh。题解还有另一种解法是先把一条完整的路储存在数组里,输入i的时候,就从i位置起把数组循环输出一遍,真是666的解法呀,果然不能被传统的思路所局限了呀!

技术分享

 

 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 
12 bool dfs(int x, int y){
13     
14     node.x = x;
15     node.y = y;
16     for(int i = 0; i < 8; i++){
17             int x = node.x + _move[i][0];
18             int y = node.y + _move[i][1];
19             if(0 <= x && x < 5 && 0 <= y && y < 6){
20                 int flag = 1;
21                 for(int j = 0; j < node.path.size(); j++){
22                     if(node.path[j] == x*6 + y){
23                         flag = 0;
24                         break;
25                     }
26                 }    
27                 if(flag){
28                     node.path.push_back(x*6 + y);//走下一步 
29                     
30                     if(node.path.size() >= 30){//当path的size等于30,则说明已经走遍 
31                         for(int i = 0; i < node.path.size(); i++){
32                             cout << node.path[i] + 1 <<  ;
33                         }
34                         cout << endl;
35                         return true;
36                     }
37                     if(dfs(x, y))return true;
38                     node.path.pop_back();//还原到原来 
39                     node.x -= _move[i][0];
40                     node.y -= _move[i][1];    
41                 }
42             }
43             
44     }
45     return false;
46 }
47 
48 int main(){
49     int n;
50     while(cin >> n && n != -1){
51         node.path.clear();
52         n = n-1;
53         int a = n / 6;
54         int b = n % 6;
55         node.path.push_back(a*6 + b);
56         dfs(a, b);
57     }
58 } 
59 
60 /*
61 #include<iostream>
62 using namespace std;
63 int a[]={1,14,25,21,29,18,5,16,12,4,8,19,27,23,10,6,17,30,22,26,13,2,15,7,3,11,24,28,20,9};
64 int main()
65 {
66     int n;
67     while(cin>>n)
68     {
69         int tmp;
70         for(int i=0;i<30;i++) 
71             if(a[i]==n)tmp=i;
72         for(int i=0;i<30;i++)
73         {
74             cout<<a[(tmp+i)%30];
75             if(i==29)cout<<endl;
76             else cout<<" ";
77         }
78     }
79 }
80 */ 

 

Sicily 1151: 简单的马周游问题(DFS)