黄金图形

来源:互联网 发布:厦门java培训班 编辑:程序博客网 时间:2024/04/27 21:22
import java.io.*;
import java.util.*;
class point
{
    
int x,y;
    
public point(int x,int y)
    
{
        
this.x=x;
        
this.y=y;
    }

}

class Test4 
{
    
static int max=0;
    
static int cout;//static Set hash;
    public static void main(String[] args)throws Exception 
    
{
        BufferedReader bf
=new BufferedReader(new FileReader("goldgraphic.in"));
        
int n=Integer.parseInt(bf.readLine());
        
for(int i=0;i<n;i++)
        
{
            max
=Integer.parseInt(bf.readLine());
            
int m=Integer.parseInt(bf.readLine());
            cout
=0;
            String tmp[];
            String s
="";
            
//hash=new HashSet();        
            point p[]=new point[m];
            
for(int j=0;j<m;j++)
            
{
                tmp
=bf.readLine().split(" ");
                p[j]
=new point(Integer.parseInt(tmp[0]),Integer.parseInt(tmp[1]));
            }

            go(
0,0,p,1,s,null);
            
if(cout!=0)
                System.out.println(
"Found "+cout+" golygon(s).");
            
else System.out.println("Found "+0+" golygon(s).");
        }
        
    }

    
public static void go(int x,int y,point p[],int step,String s,String pre)
    
{
        pre
=s;
        
if(step>max)
            
{
                
if(x==0&&y==0)
                
{cout++;System.out.println(s);}
                
//hash.add(s);
                return;
            }

        
else
        
{            
            
if(isOk(x-step,y,p,pre,'w',step))
            
{
                s
=s+"w";
                go(x
-step,y,p,step+1,s,pre);
                s
=s.substring(0,s.length()-1);
            }

            
if(isOk(x,y-step,p,pre,'s',step))
            
{
                s
=s+"s";
                go(x,y
-step,p,step+1,s,pre);
                s
=s.substring(0,s.length()-1);
            }

            
if(isOk(x+step,y,p,pre,'e',step))
            
{
                s
=s+"e";
                go(x
+step,y,p,step+1,s,pre);
                s
=s.substring(0,s.length()-1);
            }

            
if(isOk(x,y+step,p,pre,'n',step))
            
{
                s
=s+"n";
                go(x,y
+step,p,step+1,s,pre);
                s
=s.substring(0,s.length()-1);
            }

        }
        
    }

    
public static boolean isOk(int x,int y,point p[],String pre,char c,int step)
    
{
        
if(pre.equals(""))
            
return true;
        
if(pre.charAt(pre.length()-1)==c)
            
return false;
        
if(getP(pre.charAt(pre.length()-1))==c)
            
return false;            
        
if(c=='e')
        
{
            
for(int i=1;i<=step;i++)
            
{
                x
--;
                
for(int j=0;j<p.length;j++)
                    
if(x==p[j].x&&y==p[j].y)
                    
return false;
            }

        }

        
else if(c=='n')
        
{
            
for(int i=1;i<=step;i++)
            
{
                y
--;
                
for(int j=0;j<p.length;j++)
                    
if(x==p[j].x&&y==p[j].y)
                    
return false;
            }

        }

        
else if(c=='s')
        
{
            
for(int i=1;i<=step;i++)
            
{
                y
++;
                
for(int j=0;j<p.length;j++)
                    
if(x==p[j].x&&y==p[j].y)
                    
return false;
            }

        }

        
else if(c=='w')
        
{
            
for(int i=1;i<=step;i++)
            
{
                x
++;
                
for(int j=0;j<p.length;j++)
                    
if(x==p[j].x&&y==p[j].y)
                    
return false;
            }

        }
                
        
return true;
    }

    
public static char getP(char c)
    
{
        
if(c=='e')
            
return 'w';
        
if(c=='w')
            
return 'e';
        
if(c=='n')
            
return 's';
        
else 
            
return 'n';
    }

}

 

黄金图形

Input File: goldgraphic.in

想象有这样一个国家,它的城市中的街道都是有规则的矩形网络。现在假定一个对几何十分着迷的游客打算在若干座这样的城市里旅行。每次旅行从城市的中心十字路口开始,该交叉点的标号为(00),我们这位爱好数学的旅游都想要朝北、南、东、西四个方向之一出发,走过一个街区,在向北走后观赏十字路口(01)的街景,向南走后观赏(0-1),向东走后观赏(10),向西走后观赏(-10)。出于对城市规则性的极大热情,我们的数学爱好都想在下一次停下来之前走更长的一段路,也就是走两个街区。不仅如此,我们的旅游者既不想走同前次相同的方向,也不想折返,所以将向左或右转90度,下一段路将是三个街区,又一次紧接着一个转弯,然后是四个街区,五个街区,如此不断增长下去,直到最后,在一天的结束时,我们疲劳的旅行者回到出发点(00)。

由这些几何上的旅行所描述的自交图形被称作黄金图形。

不走运的是,我们的施行者奖在盛夏作上述旅行,这时的修路工作将破坏城市街道完整规律。在某些十字路口将会有无法通行的路障。然而幸运的是,这个国家有限的预算使得在任何一个城市都不会有超过50个路口被堵塞。为了获得市民的信任,城市会预先通告修路计划。我们的旅行者已经得到了一份这样的计划,并且保证不会使黄金图形的旅程被融化在沥青所阻挡。

写一个程序以构造一个城市中所有可能的黄金图形。

Input

由于我们的旅游者想要访问若干个城市,输入文件的第一行将是一个表示要访问的城市数目的整数。

对于每个城市将由包含了一个不大于20的正整数的一行开始,正整数给出了黄金图形的最长的边的长度。也就是使旅行者回到(00)的最后一条边的长度。在这之后的新的一行上将有一个在050之间(包括050)的整数M,给出了被封锁的街区的数目。接下来是M个整数对,一对占一行,分别指出了每一个路障的横、纵坐标。

Output

对于输入中的每个城市,构造所有可能的黄金图形。每个黄金图形必须用一个由集合{n,s,e,w}中的字符组成的序列表示(占一行),在黄金图形的列表之后应有一行给出所找出的解答数目。这一行的格式应当同样例输出一致。每个城市的输出之后应当有一个空行。下面是样例输入及输出。

Sample Input

2

8

2

-2 0

6 -2

8

2

2 1

-2 0

Output for the Sample Input

wsenenws

Found 1 golygon(s).

 

Found 0 golygon(s).

 

第一个城市见图

 

原创粉丝点击