练手CF3-C - Wormhouse
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                练手CF3-C - Wormhouse
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                深搜,亮點(diǎn)在那個(gè)剪枝,flag代表是否搜索數(shù)組從開(kāi)始到當(dāng)前一直等于原始數(shù)組同位置的數(shù),如果是真,就從原始數(shù)組的當(dāng)前位置的書(shū)開(kāi)始搜,否則就從0開(kāi)始搜。
見(jiàn)代碼。
?
#include <iostream> #include <cstring>using namespace std; int n,m,beg,origin[2003]; int mp[103][103]; bool vis[103][103]; int cnt; int stk[2010]; bool check() {int i;for(i=0;i<=m;i++){if(stk[i]==origin[i])continue;if(stk[i]<origin[i])return false;if(stk[i]>origin[i])return true;}return false; }void dfs(int bg,bool flag) { // cout<<cnt<<endl;if(cnt==m+1){ // for(int i=0;i<=m;i++) // cout<<stk[i]<<' '; // cout<<endl;if(stk[cnt-1]==beg&&check()){return;}else{return;}}for(int i=1;i<=n;i++){if(flag&&i<origin[cnt])continue;if(mp[bg][i]&&!vis[bg][i]){vis[bg][i]=true;vis[i][bg]=true;stk[cnt++]=i;dfs(i,flag&&i==origin[cnt-1]); // cout<<stk[cnt]<<endl;if(cnt==m+1&&stk[cnt-1]==beg&&check())return; // cout<<" "<<cnt<<endl;cnt--; // cout<<" "<<cnt<<endl;vis[bg][i]=false;vis[i][bg]=false;}}return; } int main() {cin>>n>>m;int i;cnt=1;memset(mp,0,sizeof(mp));memset(vis,false,sizeof(vis));cin>>origin[0];beg=origin[0];for(i=1;i<=m;i++){cin>>origin[i];mp[origin[i-1]][origin[i]]=1;mp[origin[i]][origin[i-1]]=1;}for(i=1;i<=n;i++) // { // for(int j=1;j<=n;j++) // cout<<mp[i][j]<<' '; // cout<<endl;}stk[0]=beg;dfs(beg,true); // cout<<cnt<<endl;if(cnt==m+1){for(i=0;i<=m;i++)cout<<stk[i]<<' ';cout<<endl;}elsecout<<"No solution"<<endl;return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/aljxy/p/3415684.html
總結(jié)
以上是生活随笔為你收集整理的练手CF3-C - Wormhouse的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: C# 执行Cmd窗口中的命令 [复制
- 下一篇: yii2 发送邮件 yii\swiftm
