• sicily 马周游问题


    数据量是8*8的了,要做个优化,尽量往分支少的方向搜
     
    马周游的问题,很经典的深搜。以后自己当做模版思路吧
     1 #include<iostream>
     2 #include<memory.h>
     3 #include<vector>
     4 #include<algorithm> 
     5 using namespace std;
     6 
     7 int road[64];
     8 bool vis[8][8];
     9 int change[]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};
    10 
    11 struct Node
    12 {
    13     int x,y,num;
    14     Node(int a,int b)
    15     {
    16         x = a;
    17         y = b;
    18         num = 0;
    19         for(int i=0;i<16;i+=2)
    20         {
    21             int now_row=a+change[i];
    22             int now_col=b+change[i+1];
    23             if(now_row>=0&&now_row<8&&now_col>=0&&now_col<8&&vis[now_row][now_col]==0)  num++;
    24             
    25         }
    26     }
    27 };
    28 
    29 bool cmp(Node a,Node b)
    30 {
    31     return a.num<b.num;
    32 }
    33 bool dfs(int row,int col,int cur)
    34 {
    35     road[cur]=8*row+col+1;
    36     if(cur==63) return 1;          //这一句很重要,是深搜的标记结束的地方。说明什么条件下要结束深搜 
    37     vector<Node> v;   
    38     for(int i=0;i<16;i+=2)
    39     {
    40         int now_row=row+change[i];
    41         int now_col=col+change[i+1];
    42         if(now_row>=0&&now_row<8&&now_col>=0&&now_col<8&&vis[now_row][now_col]==0)
    43         {
    44             Node p(now_row,now_col);
    45             v.push_back(p);
    46         }
    47     }
    48     sort(v.begin(),v.end(),cmp);
    49     for(int i=0;i<v.size();i++)
    50     {
    51         Node r=v[i];
    52         if(r.num>0||cur==62){      //一下几行是深搜的典型写法 
    53 vis[row][col]=1;
    54             if(dfs(r.x,r.y,cur+1))
    55                 return 1;            //其实深搜的递归不必想太多,从逻辑上想就好。这里是搜索行的话就return 1,不行的话就当没搜过 
    56             else vis[row][col]=0;  
    57         } 
    58     }
    59     return 0;  //能执行到这一步说明这条路径是不行的了,return 0 
    60 }
    61 int main()
    62 {
    63     int N;
    64     while(cin>>N&&N!=-1)
    65     {
    66         memset(vis,0,sizeof(vis));
    67         memset(road,0,sizeof(road));
    68         int row=(N-1)/8;
    69         int col=(N-1)%8;
    70         int current=0;
    71         vis[row][col]=1;
    72         dfs(row,col,current);
    73         for(int i=0;i<64;i++) cout<<road[i]<<' ';
    74     } 
    75 } 
  • 相关阅读:
    LeetCode:230. 二叉搜索树中第K小的元素
    LeetCode:229. 求众数 II
    LeetCode:228. 汇总区间
    LeetCode:225. 用队列实现栈
    LeetCode:209. 长度最小的子数组
    LeetCode:208. 实现 Trie (前缀树)
    疯狂的订餐系统-软件需求分析挑战之旅 【转】
    产品需求文档(PRD)的写作 【转】
    软件需求文档标准格式
    通过实例编写开发规范文档 【转】
  • 原文地址:https://www.cnblogs.com/cfhome/p/2693113.html
Copyright © 2020-2023  润新知