UVa 225 - Golygons

这道题不难,是一道简单的dfs回溯,并不困难,只不过有一个坑就是一个城市不能够走两次(特别是原点不能够在不到重点的时候走到。。。)被这个坑了好久之后,看了大大们的博客才知道了这个,真不知道大大们是怎么意识到这个问题的,题目里貌似没有说。。。



代码还可以进行剪枝优化,此处略去,代码如下:

#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;


int mstps;


typedef pair<int, int> pii;
pii stlst[100];
int rstps;
int n, k;
bool isbet(int st, int ed, int num)
{
    if(st > ed)
        swap(st, ed);
    return num >= st && num <= ed;
}
bool cango(pii st, pii ed)
{
    if(st.first == ed.first)
        for(int i = 0; i < k; ++i)
        {
            if(stlst[i].first == st.first && isbet(st.second, ed.second, stlst[i].second))
                return false;
        }
    else if(st.second == ed.second)
        for(int i = 0; i < k; ++i)
        {
            if(stlst[i].second == st.second && isbet(st.first, ed.first, stlst[i].first))
                return false;
        }
    return true;
}
vector<char> ways;


vector<pii> pass;


void dfs(pii st, int stps, char twd)
{
    if(st != make_pair(0, 0))
    {
        for(int i = 0; i < pass.size(); ++i)
            if(pass[i] == st)
                return;
    }
    else if(stps && stps != mstps){
        return;
    }
    pass.push_back(st);
    if(twd)
        ways.push_back(twd);
    if(stps == mstps)
    {
        if(st == make_pair(0, 0))
        {
            ++rstps;
            for(int i = 0; i < ways.size(); ++i)
            {
                printf("%c", ways[i]);
            }
            printf("\n");
        }
        pass.pop_back();
        ways.pop_back();
        return ;
    }
    if( (twd != 'e' && twd != 'w') && cango(st, make_pair(st.first+stps+1, st.second)))
        dfs(make_pair(st.first+stps+1, st.second), stps+1, 'e');
    if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second+stps+1)))
        dfs(make_pair(st.first, st.second+stps+1), stps+1, 'n');
    if((twd != 'n' && twd != 's') && cango(st, make_pair(st.first, st.second-stps-1)))
        dfs(make_pair(st.first, st.second-stps-1), stps+1, 's');
    if((twd != 'e' && twd != 'w') && cango(st, make_pair(st.first-stps-1, st.second)))
        dfs(make_pair(st.first-stps-1, st.second), stps+1, 'w');
    ways.pop_back();
    pass.pop_back();
}


int main()
{
    scanf("%d", &n);
    while(n--)
    {
        rstps = 0;
        scanf("%d", &mstps);
        scanf("%d", &k);
        for(int i = 0; i < k; ++i)
        {
            int x, y;
            scanf("%d %d", &x, &y);
            stlst[i] = make_pair(x, y);
        }
        //news               ensw
        ways.clear();
        dfs(make_pair(0, 0), 0, 0);
        ways.clear();
        printf("Found %d golygon(s).\n\n", rstps);
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值