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; } }