Wormholes

本文通过预处理和回溯法解决了一个有趣的虫洞问题。首先确定每个虫洞出口对应的下一个位置,接着使用回溯法枚举所有可能的虫洞配对,并判断是否存在环路。该方法有助于理解递归和图论中的环检测。

链接

分析:很有意思的一道题目,本菜调了一下午没有调出来,估计是判环过程出了问题,最后还是参照了官方题解。暴力去求解,首先预处理当前位置出洞以后将会进入的下一个位置,然后用回溯法去枚举每一对组合,在进行判环,这题收获还是很大。

 1 /*
 2     PROB:wormhole
 3     ID:wanghan
 4     LANG:C++
 5 */
 6 #include "iostream"
 7 #include "cstdio"
 8 #include "cstring"
 9 using namespace std;
10 const int maxn=20;
11 int n;
12 int x[maxn],y[maxn];
13 int Next[maxn],par[maxn];
14 bool Cycle(){
15     for(int i=1;i<=n;i++){
16         int pos=i;
17         for(int j=0;j<n;j++){
18             pos=Next[par[pos]];
19         }
20         if(pos!=0)  return true;
21     }
22     return false;
23 }
24 int solve(){
25     int i,res=0;
26     for(i=1;i<=n;i++)
27         if(par[i]==0)  break;
28     if(i>n){
29         if(Cycle())  return 1;
30         return 0;
31     }
32     for(int j=i+1;j<=n;j++){
33         if(par[j]==0){
34             par[i]=j;
35             par[j]=i;
36             res+=solve();
37             par[i]=par[j]=0;
38         }
39     }
40     return res;
41 }
42 int main()
43 {
44     freopen("wormhole.in","r",stdin);
45     freopen("wormhole.out","w",stdout);
46     cin>>n;
47     for(int i=1;i<=n;i++)
48         cin>>x[i]>>y[i];
49     for(int i=1;i<=n;i++){  //预处理当前位置出洞会达到的位置
50         for(int j=1;j<=n;j++){
51             if(y[j]==y[i]&&x[j]>x[i]){
52                 if(Next[i]==0||x[j]-x[i]<x[Next[i]]-x[i])
53                     Next[i]=j;
54             }
55         }
56     }
57     cout<<solve()<<endl;
58 }
View Code

 

转载于:https://www.cnblogs.com/wolf940509/p/7054803.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值