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
原文地址:https://www.cnblogs.com/acbingo/p/3877749.html