您的位置:首页 > 编程语言 > Go语言

UVa 225 - Golygons

2015-08-20 11:02 288 查看
这道题不难,是一道简单的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);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva acm dfs