USACO 1.3-Wormholes

来源:互联网 发布:淘宝银泰百货是真是假 编辑:程序博客网 时间:2024/05/16 01:22
此题 copy 别人的,题意都木有读的很懂。这样是不好滴,知识习惯性的更新一下 blog,以后减少这样的行为。代码粘一下,看看别人的代码吧。
/*ID: m1590291TASK: wormholeLANG: C++*/#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<vector>#include<cstring>using namespace std;struct Node{int x,y,vis,l;bool operator <(const Node &rhs)const{return x<rhs.x;}};int n,ans=0,x[20],y[20],x3[20],y3[20],r[20],label[20],cur=0,flag;vector<Node> g[20];bool cmp(int ii,int jj){return y[ii]<y[jj];}void isloop(int y,int x){int lx=x,ly=y;while(lx<g[ly].size()){if(g[ly][lx].vis) {flag=1;return;}g[ly][lx].vis=1;int t1=g[ly][lx].l;lx=x3[label[t1]],ly=y3[label[t1]];lx++;}}bool check(){for(int i=0;i<=cur;i++)for(int j=0;j<g[i].size();j++)g[i][j].vis=0;flag=0;for(int i=0;i<=cur;i++)for(int j=0;j<g[i].size();j++){for(int n=0;n<=cur;n++)for(int m=0;m<g[n].size();m++)g[n][m].vis=0;isloop(i,j);}if(flag) return true;else return false;}void solve(int c){if(c>n/2){if(check()) ans++;return;}int pos;for(int i=0;i<n;i++)if(label[i]<0){pos=i;break;}for(int i=pos+1;i<n;i++)if(label[i]<0){label[i]=pos;label[pos]=i;solve(c+1);label[i]=-1;}label[pos]=-1;}int main(){freopen("wormhole.in","r",stdin);freopen("wormhole.out","w",stdout);cin>>n;for(int i=0;i<n;i++) cin>>x[i]>>y[i];for(int i=0;i<n;i++) r[i]=i;sort(r,r+n,cmp);g[0].push_back((Node){x[r[0]],y[r[0]],0,r[0]});for(int i=1;i<n;i++){int l1=r[i],l2=r[i-1];if(y[l1]==y[l2]) g[cur].push_back((Node){x[l1],y[l1],0,l1});else g[++cur].push_back((Node){x[l1],y[l1],0,l1});}for(int i=0;i<n;i++) sort(g[i].begin(),g[i].end());for(int i=0;i<=cur;i++)for(int j=0;j<g[i].size();j++){int t1=g[i][j].l;x3[t1]=j;y3[t1]=i;}memset(label,-1,sizeof(label));solve(1);cout<<ans<<endl;return 0;}

0 0
原创粉丝点击