您的位置:首页 > 编程语言 > Go语言

UVA 225 Golygons

2017-10-15 11:28 330 查看
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]='\0';
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).\n\n",tot);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: