zoukankan      html  css  js  c++  java
  • UVa 167(八皇后)、POJ2258 The Settlers of Catan——记两个简单回溯搜索

    UVa 167

    题意:八行八列的棋盘每行每列都要有一个皇后,每个对角线上最多放一个皇后,让你放八个,使摆放位置上的数字加起来最大。

    参考:https://blog.csdn.net/xiaoxiede_wo/article/details/79973171

     1 #include <iostream>
     2 #include <cstring>
     3 #include <iomanip>
     4 using namespace std;
     5 int pic[9][9];
     6 int ans;
     7 int v[3][20];
     8 void dfs(int cur,int num){
     9     if(cur==8){//出现一组解,看能否更新
    10         ans=max(ans,num);
    11         return ;
    12     }
    13     for(int i=0;i<8;i++){
    14         if(!v[0][i]&&!v[1][cur+i]&&!v[2][cur-i+8]){//v[0] 代表行 v[1]代表副对角线 v[2]代表主对角线
    15             v[0][i]=1;v[1][cur+i]=1;v[2][cur-i+8]=1;//选这个点,标记
    16             dfs(cur+1,num+pic[cur][i]);//往下搜索
    17             v[0][i]=0;v[1][cur+i]=0;v[2][cur-i+8]=0;//复原
    18         }
    19     }
    20 }
    21 int main(){
    2223     int n;
    24     cin>>n;
    25     while(n--){
    26         ans=0;
    27         memset(v,0,sizeof(v));
    28         for(int i=0;i<8;i++)
    29             for(int j=0;j<8;j++)
    30                 cin>>pic[i][j];
    31         dfs(0,0);
    32         cout<<setw(5)<<ans<<endl;//输出有个小坑
    33     }
    34 }

    POJ2258

    题意:给你点和边的数量,再给你边的连接关系,求最长路径。点可以重复访问,边不行。

    参考:https://blog.csdn.net/miranda_ymz/article/details/79274577

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define N 26
     5 using namespace std;
     6 int n,m,ans;
     7 int edg[N][N],vis[N][N];
     8 
     9 void search(int cur,int len){
    10     ans=max(ans,len);
    11     for(int i=0;i<n;i++){
    12 13         if(edg[cur][i]==0||vis[cur][i]==1) continue;//如果两顶点不相连或已访问过,就跳过
    14         vis[cur][i]=vis[i][cur]=1;//选择这个边并继续搜索
    15         search(i,len+1);
    16         vis[cur][i]=vis[i][cur]=0;//复原 回溯
    17     }
    18 }
    19 
    20 int main(){
    21     while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
    22 23         int a,b;
    24         memset(edg,0,sizeof(edg));
    25         for(int i=0;i<m;i++){
    26             cin>>a>>b;
    27             edg[a][b]=edg[b][a]=1;//连边
    28         }
    29         ans=0;
    30         for(int i=0;i<n;i++){
    31             memset(vis,0,sizeof(vis));//清空访问
    32             search(i,0);
    33         }
    34         cout<<ans<<endl;
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    javascript 基础知识汇总(一)
    一个高效单表分页查询语句
    Linux的基本操作(一)
    Tomcat服务器配置
    C# — Winform的TextBox控件实现记忆功能
    C# — LINQ To XML示例
    C# — COM组件注册
    C# — LINQ查询的简单使用
    C# — 题库答案汇总
    C# — 题库汇总
  • 原文地址:https://www.cnblogs.com/noobimp/p/10301477.html
Copyright © 2011-2022 走看看