这个题很坑,一开始自己就以为那个图的大小就是12 * 12,去做,但是不对,很头疼。后来才知道那个并不是的,坐标可以是负的,如果是负的话,自己的程序就跑不了了,
,借鉴了一下就过了。一开始用bfs写的,自己的代码能力还不行,写不出来,所以,用了dfs。
注意一点这个题是要减枝的,就是当你不可能走回原点的时候是要减枝的,所以需要注意这一点附上代码,写的不好还望见谅
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int maxn = 105;
const char dict[] = "ensw";
int gra[maxn * 2][maxn * 2];
int vis[maxn * 2][maxn * 2];
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
int d[maxn + maxn];
int n,k;
int cnt;
int flag;
int sum[30];
bool judge(int x,int y,int cur1)
{
int dis = abs(x - 100) + abs(y - 100);
if(dis > sum[n] - sum[cur1])
return false;
return true;
}
void dfs(int f,int cur,int x,int y)
{
if(cur == n)
{
if(x != 100 || y != 100)
return;
cnt++;
for(int i = 0;i < n;i++)
{
printf("%c",dict[d[i]]);
}
cout<<endl;
return;
}
for(int di = 0; di < 4; di++)
{
if(di == f || di + f == 3)
continue;
int dx = x;
int dy = y;
flag = 1;
for(int i = 1; i <= cur + 1; i++)
{
dx = dx + dir[di][0];
dy = dy + dir[di][1];
if(gra[dx][dy] || !judge(dx,dy,cur))
{
flag = 0;
break;
}
}
if(flag && !vis[dx][dy])
{
vis[dx][dy] = 1;
d[cur] = di;
dfs(di,cur+1,dx,dy);
vis[dx][dy] = 0;
}
}
return;
}
int main()
{
sum[0] = 0;
for(int i = 1;i <= 20;i++)
{
sum[i] = sum[i-1] + i;
}
int T;
scanf("%d",&T);
while(T--)
{
int x,y;
memset(gra,0,sizeof(gra));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
for(int i = 0; i < k; i++)
{
scanf("%d%d",&x,&y);
x = x + 100;
y = y + 100;
if(x>= 0 && y >= 0)
gra[x][y] = 1;
}
cnt = 0;
dfs(-1,0,100,100);
printf("Found %d golygon(s).\n\n", cnt);
}
return 0;
}