uva 225 dfs + 减枝

这个题很坑,一开始自己就以为那个图的大小就是12 * 12,去做,但是不对,很头疼。后来才知道那个并不是的,坐标可以是负的,如果是负的话,自己的程序就跑不了了,

,借鉴了一下就过了。一开始用bfs写的,自己的代码能力还不行,写不出来,所以,用了dfs。

注意一点这个题是要减枝的,就是当你不可能走回原点的时候是要减枝的,所以需要注意这一点附上代码,写的不好还望见谅

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int maxn = 105;
const char dict[] = "ensw";
int gra[maxn * 2][maxn * 2];
int vis[maxn * 2][maxn * 2];
int dir[4][2] = {{1,0},{0,1},{0,-1},{-1,0}};
int d[maxn + maxn];
int n,k;
int cnt;
int flag;
int sum[30];
bool judge(int x,int y,int cur1)
{
    int dis = abs(x - 100) + abs(y - 100);
    if(dis > sum[n] - sum[cur1])
        return false;
    return true;
}

void dfs(int f,int cur,int x,int y)
{
        if(cur == n)
        {
            if(x != 100 || y != 100)
                return;
            cnt++;
            for(int i = 0;i < n;i++)
            {
                printf("%c",dict[d[i]]);
            }
            cout<<endl;
            return;
        }

        for(int di = 0; di < 4; di++)
        {
            if(di == f || di + f == 3)
                continue;
            int dx = x;
            int dy = y;

            flag = 1;
            for(int i = 1; i <= cur + 1; i++)
            {
                dx = dx + dir[di][0];
                dy = dy + dir[di][1];
                if(gra[dx][dy] || !judge(dx,dy,cur))
                {
                    flag = 0;
                    break;
                }
            }
            if(flag && !vis[dx][dy])
            {
               vis[dx][dy] = 1;
               d[cur] = di;
               dfs(di,cur+1,dx,dy);
               vis[dx][dy] = 0;
            }
        }
    return;
}
int main()
{
    sum[0] = 0;
    for(int i = 1;i <= 20;i++)
    {
        sum[i] = sum[i-1] + i;

    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x,y;
        memset(gra,0,sizeof(gra));
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&k);
        for(int i = 0; i < k; i++)
        {
            scanf("%d%d",&x,&y);
            x = x + 100;
            y = y + 100;
            if(x>= 0 && y >= 0)
            gra[x][y] = 1;
        }
        cnt = 0;
        dfs(-1,0,100,100);
       printf("Found %d golygon(s).\n\n", cnt);

    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值