zoukankan      html  css  js  c++  java
  • URAL 1920 Titan Ruins: the Infinite Power of Magic

    大意:

    有一张N*N的网格,你每次可以走一步,每格只能走一次,有没有一种方法让走了L步后回到一个距原点1步远的格子? 


    没有输出Unsuitable device,否则输出Overwhelming power of magic并输出方案。 


    一开始用DFS 奇偶剪枝了还是TLE,

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #define N 110
    using namespace std;
    
    int n,t,end_i,end_j;
    bool visited[N][N],flag,ans;
    char map[N][N];
    int run[10010][2];
    int tem;
    int a[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    
    void DFS(int i,int j,int c)
    {
    if(flag){ return ;}
        if(c>t) return ;
        if(i<=0||i>n||j<=0||j>n) {return ;}
        if(map[i][j]=='D'&&c==t) {flag=ans=true; return ;}
        int temp=abs(i-end_i)+abs(j-end_j);
        temp=t-temp-c;         //t扣掉还要走的最短步temp 和 已经走过的 c 如果这些步还是奇数直接不满足
        if(temp&1) return ;//奇偶剪枝 奇数return
       for(int k=0;k<4;k++)
        	if(!visited[i+a[k][0]][j+a[k][1]]) //开始进行各个方向的探索 记得回溯,取消之前走的状态
        	{
        	 visited[i+a[k][0]][j+a[k][1]]=true;
        	 DFS(i+a[k][0],j+a[k][1],c+1);
        	 if(flag){cout<<i+a[k][0]<<" "<<j+a[k][1]<<endl;break;}
        	 visited[i+a[k][0]][j+a[k][1]]=false;
        	}
    }
    
    int main()
    {
        int i,j;
        while(cin>>n>>t)
        {
        	if(t%2!=0||t>n*n){cout<<"Unsuitable device"<<endl;continue;}
        	else cout<<"Overwhelming power of magic"<<endl;
        	cout<<"1 1"<<endl;
        	memset(visited,0,sizeof(visited));
    
    
        	        for(i=1;i<=n;i++)
        	        {
    
        	            for(j=1;j<=n;j++)
        	            {
        	               map[i][j]='.';
        	            }
        	        }
        	        end_i=2;end_j=1;
        	        map[2][1]='D';
        	        visited[1][1]=1;
    
            ans=flag=false;
    
           DFS(1,1,1);
    //        if(ans) cout<<"YES"<<endl;
    //        else cout<<"NO"<<endl;
        }
        return 0;
    }

    后来是找规律做出来的,根据奇偶分类讨论一下;;

    代码写的很烂。。


    很多复用的没复用。。


    #include<iostream>
    #include<cstring>
    #include<cmath>
    #define N 110
    using namespace std;
    
    int n,t,end_i,end_j;
    bool visited[N][N],flag,ans;
    char map[N][N];
    int run[10010][2];
    int tem;
    int a[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    
    int main()
    {
        int i;int xx,yy,kk;
        while(cin>>n>>t)
        {
        	if(t%2!=0||t>n*n){cout<<"Unsuitable device"<<endl;continue;}
        	else cout<<"Overwhelming power of magic"<<endl;
    //    	cout<<"1 1"<<endl;
        	if(n%2==0){
        		if(t<=2*n){
        			for(i=1;i<=t/2;i++){
        				cout<<1<<" "<<i<<endl;
        			}
        			for(i=t/2;i>0;i--){
        			    				cout<<2<<" "<<i<<endl;
        			    			}
        		}
        		else{
        		 kk=t-2*n;
        		 yy=kk/(2*(n-2));
        		 xx=kk%(2*(n-2));
        		for(i=1;i<=n;i++){
        			cout<<"1 "<<i<<endl;
        		}
        		if(xx!=0){
        			int w2=n-2;
        		for( i=2;i<=2+xx/2;i++){
        			cout<<i<<" "<<n<<endl;
        		}
        		for( i=2+xx/2;i>=2;i--){
        		    			cout<<i<<" "<<n-1<<endl;
        		    		}
        		while(yy--){
    
        	    				for(i=2;i<=n;i++)
        	    					cout<<i<<" "<<w2<<endl;
        	    				for(i=n;i>=2;i--)
        	    				    					cout<<i<<" "<<w2-1<<endl;
        	    				w2-=2;
        	    			}
        		while(w2!=0){
    
        		    					cout<<"2 "<<w2<<endl;
        		    					cout<<"2 "<<w2-1<<endl;
        		    				w2-=2;
        		    			}
        		}
        		else{
        			int wei;
        			wei=n;
        			while(yy--){
    
        				for(i=2;i<=n;i++)
        					cout<<i<<" "<<wei<<endl;
        				for(i=n;i>=2;i--)
        				    					cout<<i<<" "<<wei-1<<endl;
        				wei-=2;
        			}
        			while(wei!=0){
    
        					cout<<"2 "<<wei<<endl;
        					cout<<"2 "<<wei-1<<endl;
        				wei-=2;
        			}
        		}
        		}
        	}
        	else{
    
        		if(t<=2*n){
        			for(i=1;i<=t/2;i++){
        				cout<<1<<" "<<i<<endl;
        			}
        			for(i=t/2;i>0;i--){
        			    				cout<<2<<" "<<i<<endl;
        			    			}
        		}
        		else if(t<=2*n+2*(n-2)){
        			int er=(t-(2*n))/2;
        			for(i=1;i<=n;i++){
        			    				cout<<1<<" "<<i<<endl;
        			    			}
        			for(i=n;i>=3;i--){
        			    			    				cout<<2<<" "<<i<<endl;
        			    			    			}
        			for(i=2;i<=2+er;i++){
        				cout<<i<<" "<<2<<endl;
        			}
        			for(i=er+2;i>=2;i--){
        			    				cout<<i<<" "<<1<<endl;
        			    			}
    
        		}
        		else if(t<=(n+n-1+3*(n-2))){
        			int bb=(t-(2*n+2*(n-2)))/2;
        			for(i=1;i<=n;i++){
        			    	cout<<1<<" "<<i<<endl;
        			    			    	}
        			for(i=n;i>=3;i--){
        			    			    	cout<<2<<" "<<i<<endl;
        			    			    			    	}
        			for(i=3;i<=n;i++){
        				cout<<i<<" "<<3<<endl;
        			}
        			cout<<n<<" "<<2<<endl;
        			int x=n,y=1;
        			cout<<x<<" "<<y<<endl;
        			x--;
        			cout<<x<<" "<<y<<endl;
    
        			while(1){
        				if(x==2&&y==1){break;}
        				if(bb>0&&y==1&&x%2==0){
        					y=2;bb--;
        					cout<<x<<" "<<y<<endl;
        				}
        				else if(y==2&&x%2==0){
        					x--;
        					cout<<x<<" "<<y<<endl;
        				}
        				else if(y==2&&x%2==1){
        					y=1;cout<<x<<" "<<y<<endl;
        				}
        				else if(y==1&&x%2==1){
        					x--;
        					cout<<x<<" "<<y<<endl;
        				}
        				else if(bb<=0&&y==1&&x%2==0){
        					x--;
        					cout<<x<<" "<<y<<endl;
        				}
        			}
        		}
        		else{
        		 kk=t-(n+n-1+3*(n-2));
        		 yy=kk/(2*(n-2));
        		 xx=kk%(2*(n-2));
        		for(i=1;i<=n;i++){
        			cout<<"1 "<<i<<endl;
        		}
        		if(xx!=0){
        			int w21=n-2;
        		for( i=2;i<=2+xx/2;i++){
        			cout<<i<<" "<<n<<endl;
        		}
        		for( i=2+xx/2;i>=2;i--){
        		    			cout<<i<<" "<<n-1<<endl;
        		    		}
        		while(yy--){
    
        	    				for(i=2;i<=n;i++)
        	    					cout<<i<<" "<<w21<<endl;
        	    				for(i=n;i>=2;i--)
        	    				    					cout<<i<<" "<<w21-1<<endl;
        	    				w21-=2;
        	    			}
        		while(w21!=3){
    
        		    					cout<<"2 "<<w21<<endl;
        		    					cout<<"2 "<<w21-1<<endl;
        		    				w21-=2;
        		    			}
        		}
        		else{
        			int wei2;
        			wei2=n;
        			while(yy--){
    
        				for(i=2;i<=n;i++)
        					cout<<i<<" "<<wei2<<endl;
        				for(i=n;i>=2;i--)
        				    					cout<<i<<" "<<wei2-1<<endl;
        				wei2-=2;
        			}
        			while(wei2!=3){
    
        					cout<<"2 "<<wei2<<endl;
        					cout<<"2 "<<wei2-1<<endl;
        				wei2-=2;
        			}
        		}
        		/*
        		 *
        		 */
        		for(i=2;i<=n;i++){
        		    				cout<<i<<" "<<3<<endl;
        		    			}
        		    			cout<<n<<" "<<2<<endl;
        		    			int x=n,y=1;
        		    			cout<<x<<" "<<y<<endl;
        		    			x--;
        		    			cout<<x<<" "<<y<<endl;
    
        		    			while(1){
        		    				if(x==2&&y==1){break;}
        		    				if(y==1&&x%2==0){
        		    					y=2;
        		    					cout<<x<<" "<<y<<endl;
        		    				}
        		    				else if(y==2&&x%2==0){
        		    					x--;
        		    					cout<<x<<" "<<y<<endl;
        		    				}
        		    				else if(y==2&&x%2==1){
        		    					y=1;cout<<x<<" "<<y<<endl;
        		    				}
        		    				else if(y==1&&x%2==1){
        		    					x--;
        		    					cout<<x<<" "<<y<<endl;
        		    				}
    
        		    			}
    
        		}
    
        	}
    
        }
        return 0;
    }
    


    有的队也有用DFS过的T T

    #include<iostream>
    using namespace std;
    int n,l,ans;
    void dfs(int x,int y,int z){
    	if(ans==l) return ;
    	if(x>n||y>n) return ;
    	if(z==0){
    		printf("%d %d
    ",x,y);
    		ans+=2;
    		dfs(x+1,y,0);
    		printf("%d %d
    ",x,y+1);
    		if(n%2==x%2) dfs(x,3,1);
    	}
    	else if(z==1){
    		printf("%d %d
    ",x,y);
    		ans+=2;
    		dfs(x,y+1,1);
    		printf("%d %d
    ",x-1,y);
    		if(x==3&&y%2==0) dfs(x-2,y,2);
    	}
    	else if(z==2){
    		ans+=2;
    		printf("%d %d
    ",x,y);
    		printf("%d %d
    ",x,y-1);
    	}
    }
    int main(){
    	cin>>n>>l;
    	if(l%2==1||n*n<l){
    		printf("Unsuitable device
    ");
    	}
    	else{
    		printf("Overwhelming power of magic
    ");
    		printf("1 1
    ");
    		printf("2 1
    ");
    		ans=4;
    		dfs(3,1,0);
    		printf("2 2
    ");
    		if(ans!=n) dfs(2,3,1);
    		printf("1 2
    ");
    	}
    	return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    Json对象与Json字符串互转(4种转换方式)
    Web.config配置文件详解
    jQuery BlockUI Plugin Demo 6(Options)
    jQuery BlockUI Plugin Demo 5(Simple Modal Dialog Example)
    jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
    jQuery BlockUI Plugin Demo 3(Page Blocking Examples)
    jQuery BlockUI Plugin Demo 2
    <configSections> 位置引起的错误
    关于jQuery的cookies插件2.2.0版设置过期时间的说明
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/france/p/4808659.html
Copyright © 2011-2022 走看看