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 }
题意:给你点和边的数量,再给你边的连接关系,求最长路径。点可以重复访问,边不行。
参考: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 }
Stay Hungry, Stay Foolish