UVA 225 Golygons

https://vjudge.net/problem/UVA-225

题意:

平面上有k个障碍点,第i次走i个单位,每次方向必须改变90°,

不能停留在重复点,不能经过障碍点

输出移动序列方案  以及 总数

n<=20,大概一个方向离原点的最远距离为110

超过这个距离就无法返回原点

负数坐标整体平移

#include<cstdio>
#include<cstring>
#include<algorithm>

int n,tot;
bool mp[221][221],vis[221][221];
char ans[21];

void dfs(int sum,int x,int y,char last)
{
    if(sum==n)
    {
        if(x || y) return;
        if(!x && !y)
        {
            ans[sum]='';
            puts(ans); tot++;
            return;
        }
    }
    if(vis[x+110][y+110]) return;
    vis[x+110][y+110]=true;
    bool f;
    if(last!='e' && last!='w' && abs(y+sum+1)<=110)
    {
        f=false;
        for(int i=1;i<=sum+1 && !f;i++) f=mp[x+i+110][y+110];
        if(!f) dfs(sum+1,x+sum+1,y,ans[sum]='e'); 
    }
    if(last!='n' && last!='s' && abs(x-sum-1)<=110)
    {
        f=false;
        for(int i=1;i<=sum+1 && !f;i++) f=mp[x+110][y+i+110];
        if(!f) dfs(sum+1,x,y+sum+1,ans[sum]='n');
    }
    if(last!='s' && last!='n' && abs(x+sum+1)<=110)
    {
        f=false;
        for(int i=1;i<=sum+1 && !f;i++) f=mp[x+110][y-i+110];
        if(!f) dfs(sum+1,x,y-sum-1,ans[sum]='s');
    }
    if(last!='w' && last!='e' && abs(y-sum-1)<=110)
    {
        f=false;
        for(int i=1;i<=sum+1 && !f;i++) f=mp[x-i+110][y+110];
        if(!f) dfs(sum+1,x-sum-1,y,ans[sum]='w');
    }
    vis[x+110][y+110]=false;
}

int main()
{
    int T,k,x,y;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        memset(mp,false,sizeof(mp));
        while(k--)
        {
            scanf("%d%d",&x,&y);
            if(abs(x)<=110 && abs(y)<=110)    mp[x+110][y+110]=true;
        }
        tot=0;
        dfs(0,0,0,'a');
        printf("Found %d golygon(s).

",tot);
    }
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7670335.html