UVa 167(八皇后)POJ2258——记两个简单回溯搜索

Posted 二十四桥明月夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 167(八皇后)POJ2258——记两个简单回溯搜索相关的知识,希望对你有一定的参考价值。

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()
22 {
23     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 }

 

以上是关于UVa 167(八皇后)POJ2258——记两个简单回溯搜索的主要内容,如果未能解决你的问题,请参考以下文章

uva-167-枚举

双倍快乐:两个八皇后:ybt1213&ybt1214

八皇后问题

八皇后问题

八皇后问题

八皇后问题