zoukankan      html  css  js  c++  java
  • UVa225,Golygons

    刘儒家翻译的走出的图形可以自交,不知道大家是怎么理解的,反正我是认为这句话的意思是告诉我允许一个点访问多次

    这样是WA的,n=15和n=16时多输出很多数据,应该是不允许自交,也就是不允许一个点访问多次。(找这个错花了我整整一下午的时间,总之找出来了还是蛮开心的)

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #define maxn 1000+10
    #define d 500
    using namespace std;
    int map[maxn][maxn],n,k,ans[25],tot,vst[maxn][maxn];
    int init(){
        memset(map,0,sizeof(map));
        memset(ans,0,sizeof(ans));
        memset(vst,0,sizeof(vst));
        tot=0;
        cin>>n>>k;
        int x,y;
        for (int i=1;i<=k;i++){
            cin>>x>>y;
            x+=d;y+=d;
            if (x>=0&&y>=0&&x<maxn&&y<maxn)map[x][y]=-1;
        }
    }
    int ok(int x,int y,int endx,int endy,int f){
        switch (f){
            case 1:
                for (int i=x;i<=endx;i++)
                    if(map[i][y]) return 0;
                break;
            case 2:
                for (int i=y;i<=endy;i++)
                    if(map[x][i]) return 0;
                break;
            case 3:
                for (int i=endy;i<=y;i++)
                    if(map[x][i]) return 0;
                break;
            case 4:
                for (int i=endx;i<=x;i++)
                    if(map[i][y]) return 0;
                break;
        }
        return 1;
    }
    int printf(){
        tot++;
        for (int i=1;i<=n;i++){
            switch(ans[i]){
                case 1:cout<<"e";break;
                case 2:cout<<"n";break;
                case 3:cout<<"s";break;
                case 4:cout<<"w";break;
            }
        }
        cout<<endl;
    }
    int dfs(int x,int y,int f,int cnt){
        int endx,endy;
        switch (f){
            case 1:endx=x+cnt;endy=y;break;
            case 2:endx=x;endy=y+cnt;break;
            case 3:endx=x;endy=y-cnt;break;
            case 4:endx=x-cnt;endy=y;break;
        }
        ans[cnt]=f;
        if (!ok(x,y,endx,endy,f)) return 0;
        if (cnt!=n&&endx==d&&endy==d) return 0;
        if (vst[endx][endy]) return 0;
        if (cnt==n&&endx==d&&endy==d){
            printf();
            return 0;
        }
        if(cnt==n) return 0;
            switch (f){
                case 1:
                    vst[endx][endy]=1;
                    dfs(endx,endy,2,cnt+1);
                    vst[endx][endy]=0;
                    vst[endx][endy]=1;
                    dfs(endx,endy,3,cnt+1);
                    vst[endx][endy]=0;
                    break;
                case 2:
                    vst[endx][endy]=1;
                    dfs(endx,endy,1,cnt+1);
                    vst[endx][endy]=0;
                    vst[endx][endy]=1;
                    dfs(endx,endy,4,cnt+1);
                    vst[endx][endy]=0;
                    break;
                case 3:
                    vst[endx][endy]=1;
                    dfs(endx,endy,1,cnt+1);
                    vst[endx][endy]=0;
                    vst[endx][endy]=1;
                    dfs(endx,endy,4,cnt+1);
                    vst[endx][endy]=0;
                    break;
                case 4:
                    vst[endx][endy]=1;
                    dfs(endx,endy,2,cnt+1);
                    vst[endx][endy]=0;
                    vst[endx][endy]=1;
                    dfs(endx,endy,3,cnt+1);
                    vst[endx][endy]=0;
                    break;
            }
    }
    int main()
    {
        int T;
        cin>>T;
        while (T--)    {
            init();
            for (int w=1;w<=4;w++)
                dfs(d,d,w,1);
            cout<<"Found "<<tot<<" golygon(s)."<<endl;
            cout<<endl;
        }
    }
    View Code
  • 相关阅读:
    ci高级使用方法篇之连接多个数据库
    JavaSE入门学习17:Java面向对象之package(包)
    找出字符串中第一个出现次数最多的字符
    red5源代码编译并打包公布
    J.U.C--locks--AQS分析
    Spring Web MVC 原理学习(下)
    深入理解 Linux 内存管理
    Java面试问题总结
    盗版者的失落
    eclipse配置lombok插件
  • 原文地址:https://www.cnblogs.com/acbingo/p/3877749.html
Copyright © 2011-2022 走看看