设为首页 加入收藏

TOP

uva 225 - Golygons(暴力)
2015-07-24 10:37:40 来源: 作者: 【 】 浏览:183
Tags:uva 225 Golygons 暴力

题目链接:uva 225 - Golygons


题目大意:从(0,0)出发,每次走1,2,3...,n。能回到原点的方案,每次走完需要改变方向,也不可以往回走。然后会给出k个障碍物的坐标。不可以经过障碍物。并且停留的地方不可以重复。输出所有方案,按照字典序。


解题思路:被坐标坑死了,一直RE,注意一下坐标关系就可以了,字典序可以从一开始找方向就处理掉。

还有多一条剪枝,就是当前位置太远剩余的所有步数都不够回道原点。


#include 
  
   
#include 
   
     #include 
    
      const int N = 250; const int tmp = 105; const int dir[4][2] = { {1, 0}, {0, 1}, {0, -1}, {-1, 0} }; const char sign[5] = "ensw"; int n, ans; int g[N][N], v[N], sum[tmp]; void init() { ans = 0; memset(g, 0, sizeof(g)); int a, b, k; scanf("%d%d", &n, &k); for (int i = 0; i < k; i++) { scanf("%d%d", &a, &b); if (abs(a) > tmp || abs(b) > tmp) continue; g[a+tmp][b+tmp] = -1; } } bool judge(int x, int y, int d, int k) { for (int i = 1; i <= k; i++) { x += dir[d][0]; y += dir[d][1]; if (abs(x) > tmp || abs(y) > tmp) continue; if (g[x+tmp][y+tmp] == -1) return true; } if (abs(x) + abs(y) > sum[20] - sum[k]) return true; return false; } void dfs(int x, int y, int d, int f) { if (d > n) { if (x == 0 && y == 0) { for (int i = 1; i <= n; i++) printf("%c", sign[v[i]]); printf("\n"); ans++; } return; } int& i = v[d]; for (i = 0; i < 4; i++) { if (i == f || i + f == 3) continue; if (judge(x, y, i, d)) continue; int p = x + dir[i][0] * d, q = y + dir[i][1] * d; if (g[p+tmp][q+tmp]) continue; g[p+tmp][q+tmp] = 1; dfs(p, q, d + 1, i); g[p+tmp][q+tmp] = 0; } } int main() { sum[0] = 0; for (int i = 1; i <= 20; i++) sum[i] = sum[i-1] + i; int cas; scanf("%d", &cas); while (cas--) { init(); dfs(0, 0, 1, -1); printf("Found %d golygon(s).\n\n", ans); } return 0; } 
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ STL (标准模板库)精解 下一篇cf-215C-Crosses

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: