zoukankan      html  css  js  c++  java
  • 紫书搜索 习题7-2 UVA

    题目链接:

    https://vjudge.net/problem/UVA-225

    题意:

    题解:

    枚举每一步的方向 没有想到

    字典序可以从一开始找方向就处理掉。
    还有多一条剪枝,就是当前位置太远剩余的所有步数都不够回道原点

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 int n,k;
    18 int lim = 105;
    19 int G[240][240],vis[240][240],sum[30];
    20 int v[30]; // 每一步的方向
    21 int ans;
    22 char sign[5] = "ensw";
    23 int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}}; // ensw
    24 
    25 bool ok(int x,int y,int k,int d){
    26     for(int i=1; i<=k; i++){
    27         x += dir[d][0], y += dir[d][1];
    28         if(G[x+lim][y+lim] == -1) return false;
    29     }
    30 
    31     if(abs(x)+abs(y) > sum[n]-sum[k]) return false;
    32     return true;
    33 }
    34 
    35 void dfs(int x,int y,int k,int fd){
    36     if(x==0 && y==0 && k==n+1){
    37         for(int i=1; i<k; i++)
    38             printf("%c",sign[v[i]]);
    39         puts("");
    40         ans++;
    41         return ;
    42     }
    43     if(k > n) return ;
    44 
    45     for(v[k]=0; v[k]<4; v[k]++){ // 枚举每一步的方向
    46         if(v[k]==fd || v[k]+fd==3) continue;  // 同向 或者 反向
    47         if(!ok(x,y,k,v[k])) continue; // 剪枝, 如果碰到街区就不走,并且如果剩下的步数 < (x,y)->(0,0)的步数也不行
    48         int tx = x + dir[v[k]][0]*k, ty = y + dir[v[k]][1]*k;
    49         if(!vis[tx+lim][ty+lim]){
    50             vis[tx+lim][ty+lim] = 1;
    51             dfs(tx,ty,k+1,v[k]);
    52             vis[tx+lim][ty+lim] = 0;
    53         }
    54     }
    55 }
    56 
    57 int main(){
    58     int T = read();
    59     sum[0] = 0;
    60     for(int i=1; i<=20; i++)  sum[i] = sum[i-1]+i;
    61     for(int cas=1; cas<=T; cas++){
    62         MS(G); MS(vis); ans=0;
    63         scanf("%d%d",&n,&k);
    64         for(int i=0; i<k; i++){
    65             int u,v; scanf("%d%d",&u,&v);
    66             G[u+lim][v+lim] = -1;  // 把所有的坐标转换为正
    67         }
    68         dfs(0,0,1,-1);
    69         printf("Found %d golygon(s).
    
    ",ans);
    70     }
    71 
    72     return 0;
    73 }
  • 相关阅读:
    bzoj 1086 [SCOI2005]王室联邦——思路
    bzoj 3809 Gty的二逼妹子序列——莫队+分块
    bzoj 3781 小B的询问——分块
    bzoj 3309 DZY Loves Math——反演+线性筛
    洛谷 1079 Vigenère 密码——模拟水题
    洛谷 1082 同余方程——exgcd(水题)
    bzoj2662 [BeiJing wc2012]冻结 ——分层图
    bzoj2242 [SDOI2011]计算器——BSGS
    bzoj1008 [HNOI2008]越狱——快速幂
    bzoj1607 [Usaco2008 Dec]Patting Heads 轻拍牛头——暴力
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827602.html
Copyright © 2011-2022 走看看