USACO section 1.3 Wormholes

xiaoxiao2021-02-28  67

这个题目我首先考虑的是如何配对的问题。 我的想法是,先给所有点按输入次序编号。然后开一个数组来记录配对问题。利用深搜枚举出所有情况。 之后就是,对每一组配对结果的测试。我的想法就是,粗暴的模拟一下他的行走过程,设定一个阈值。当你经过各个虫洞点的数量已经超过阈值时,就算你卡住了。阈值的设定就是根据感觉来的。。。。

/* ID: 13913351 LANG: C++ TASK:wormhole */ #include<iostream> #include<fstream> #include<cstring> #define cin fin #define cout fout using namespace std; ifstream fin("wormhole.in"); ofstream fout("wormhole.out"); const int N=15; int n; int a[N+1][2]; int pa[N+1];//pa[i] 表示与i与pa[i]是一对 bool flag[N+1]; int sum=0; int route[N*4]; bool tag=false; void search(int cur,int k) { //cout<<pa[cur]; k++; long long int min=9999999999; int next=0; int i; for(i=1;i<=n;i++) { if(i!=pa[cur]&&a[i][1]==a[pa[cur]][1]&&a[i][0]>a[pa[cur]][0]) { if(min>a[i][0]-a[pa[cur]][0]) { min=a[i][0]-a[pa[cur]][0]; next=i; } } } if(next!=0) { k++; if(k>50) { tag=true; return ; } search(next,k); } } bool test() { int i; for(i=1;i<=n;i++) { tag=false; search(i,1); if(tag) return true; } return false; } void dfs(int step) { if(step==n+1) { if(test()) { sum++; // cout<<endl; } return ; } if(flag[step]) { dfs(step+1); return ; } for(int i=1;i<=n;i++) { if(!flag[i]&&i!=step) { pa[step]=i; pa[i]=step; flag[i]=true; flag[step]=true; dfs(step+1); flag[step]=false; flag[i]=false; } } } int main() { cin>>n; int i; for(i=1;i<=n;i++) { cin>>a[i][0]>>a[i][1]; } memset(flag,false,sizeof(flag)); dfs(1); cout<<sum<<endl; }

代码写的不怎么规范,我会慢慢成长的。

转载请注明原文地址: https://www.6miu.com/read-59257.html

最新回复(0)