UVa225,Golygons

时间:2023-03-09 09:55:43
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[],tot,vst[maxn][maxn];
int init(){
memset(map,,sizeof(map));
memset(ans,,sizeof(ans));
memset(vst,,sizeof(vst));
tot=;
cin>>n>>k;
int x,y;
for (int i=;i<=k;i++){
cin>>x>>y;
x+=d;y+=d;
if (x>=&&y>=&&x<maxn&&y<maxn)map[x][y]=-;
}
}
int ok(int x,int y,int endx,int endy,int f){
switch (f){
case :
for (int i=x;i<=endx;i++)
if(map[i][y]) return ;
break;
case :
for (int i=y;i<=endy;i++)
if(map[x][i]) return ;
break;
case :
for (int i=endy;i<=y;i++)
if(map[x][i]) return ;
break;
case :
for (int i=endx;i<=x;i++)
if(map[i][y]) return ;
break;
}
return ;
}
int printf(){
tot++;
for (int i=;i<=n;i++){
switch(ans[i]){
case :cout<<"e";break;
case :cout<<"n";break;
case :cout<<"s";break;
case :cout<<"w";break;
}
}
cout<<endl;
}
int dfs(int x,int y,int f,int cnt){
int endx,endy;
switch (f){
case :endx=x+cnt;endy=y;break;
case :endx=x;endy=y+cnt;break;
case :endx=x;endy=y-cnt;break;
case :endx=x-cnt;endy=y;break;
}
ans[cnt]=f;
if (!ok(x,y,endx,endy,f)) return ;
if (cnt!=n&&endx==d&&endy==d) return ;
if (vst[endx][endy]) return ;
if (cnt==n&&endx==d&&endy==d){
printf();
return ;
}
if(cnt==n) return ;
switch (f){
case :
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
break;
case :
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
break;
case :
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
break;
case :
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
vst[endx][endy]=;
dfs(endx,endy,,cnt+);
vst[endx][endy]=;
break;
}
}
int main()
{
int T;
cin>>T;
while (T--) {
init();
for (int w=;w<=;w++)
dfs(d,d,w,);
cout<<"Found "<<tot<<" golygon(s)."<<endl;
cout<<endl;
}
}