剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点。

剪枝2:当前位置怎么也走不回去。

3:沿途判断障碍即可。

在oj上提交0.347s,最快的0.012s,应该有更好的做法。

#include<bits/stdc++.h>

const char *bin = "ensw";
const int dx[] = {,, ,-};
const int dy[] = {,,-, }; const int maxn = ;//1+...20
const int o = ;
const int N = ;
const int nxt_dir[][] = {{,},{,},{,},{,},{,,,}};
const int deg[] = {,,,,};
int vis[maxn][maxn];
int n;
int sum[N];
int left[N];
int path[N];
int cnt;
void dfs(int x,int y,int d,int dir)
{
if(d++ == n ){
if(x == o && y == o){
for(int i = ; i < n; i++){
printf("%c",bin[path[i]]);
}
putchar('\n');
cnt++;
}
return ;
}
for(int i = ; i < deg[dir]; i++){
int j = nxt_dir[dir][i];
int nx = x+dx[j]*d, ny = y+dy[j]*d;
if(vis[nx][ny]) continue;
if(abs(nx-o) + abs(ny-o) > left[d]) continue;
bool flag = false;
if(j == || j == ){
for(int tx = x+dx[j]; tx != nx ; tx+=dx[j]){
if(!~vis[tx][y]) {flag = true; break;}
}
}else {
for(int ty = y+dy[j]; ty != ny ; ty+=dy[j]){
if(!~vis[x][ty]) {flag = true; break;}
}
}
if(flag) continue;
path[d-] = j;
vis[nx][ny] = ;
dfs(nx,ny,d,j);
vis[nx][ny] = ;
}
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
for(int i = ; i < N; i++)
sum[i] = sum[i-]+i;
while(T--){
int k;
scanf("%d%d",&n,&k);
if(((n>>)&)^(n&)) { printf("Found 0 golygon(s).\n\n"); continue; }
int tx,ty;
memset(vis,,sizeof(vis));
for(int i = ; i < k; i++){
scanf("%d%d",&tx,&ty);
if(abs(tx)<o && abs(ty)<o ) vis[tx+o][ty+o] = -;
}
for(int i = ; i < n; i++)
left[i] = sum[n] - sum[i];
cnt = ;
dfs(o,o,,);
printf("Found %d golygon(s).\n\n",cnt);
}
return ;
}

最新文章

  1. [LeetCode] Find the Difference
  2. C#时间戳转时间-时间转时间戳
  3. curl --connect-timeout 判断国内外网络windows 批处理
  4. void 关键字
  5. javascript 字符串加密的几种方法
  6. json格式
  7. LAMP整理
  8. 戏(细)说Executor框架线程池任务执行全过程(上)
  9. 用ffmpeg把H264数据流解码成YUV420P
  10. C#中有关字符串去重的解决方案
  11. shell 字符串
  12. C语言范例学习06-上
  13. js计时功能
  14. 配置NTP网络时间自动校对系统时间和创建备份文件
  15. Oracle 存储过程笔记.
  16. JS 同步输入
  17. Luogu P2657 [SCOI2009]windy数
  18. weblogic 乱码
  19. PostgreSQL(一)教程 -----高级特性
  20. SSL证书链说明

热门文章

  1. 洛谷P3382 【模板】三分法(三分找凹凸点)
  2. HDU - 5451 Best Solver(循环节+矩阵快速幂)
  3. Git 时光穿梭鸡 删除文件 以及批量删除文件
  4. codeforces 547B【单调栈】
  5. [openjudge] 1455:An Easy Problem 贪心
  6. 背包dp
  7. 三、python的基本类型
  8. Luogu P4403 [BJWC2008]秦腾与教学评估【二分答案】By cellur925
  9. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
  10. Linux上传下载工具FileZilla(GNU软件) 文件传输和配置文件修改