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]='\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); } }