• USACO 1.3-Wormholes


    此题 copy 别人的,题意都木有读的很懂。这样是不好滴,知识习惯性的更新一下 blog,以后减少这样的行为。代码粘一下,看看别人的代码吧。

    /*
    ID: m1590291
    TASK: wormhole
    LANG: 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;
    }
    


  • 相关阅读:
    导出htmlcleaner
    备份
    本地win7搭建SVN
    nutch 导入ecl
    linux 启动nutch
    c++中的构造函数前加上explicit
    string::erase的使用心得
    C++的static关键字(转载)
    Boot Trigger
    strtol()详解
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6352034.html
Copyright © 2020-2023  润新知