HDU查找(1)

1010 Tempter of the Bone

dfs,在搜索前注意幾點:
1.T必須大於等於最短距離,否則無解
2.T和最短距離的差必須是一個偶數,否則無解
3.在T沒有減到0之前,不要走向終點
4.注意每次dfs後把剛踩的點變回’.’

#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<algorithm>

using namespace std;
char c[8][8];
int n, m, t;
//起點與終點座標
int sx, sy, dx, dy;
//起點到終點距離
int dis;

bool exit(int t, int sx, int sy)
{


    //查看行走軌跡
    //printf("%d %d %d\n", t, sx, sy);

    if (t == 0)
        return c[sy][sx] == 'D';

    //如果步數未走完已到終點
    if (c[sy][sx] == 'D')
        return false;

    
    bool flag = false;
    

    c[sy][sx] = 'X';

    

    //move upper
    if (!flag && sy != 0 && c[sy - 1][sx] != 'X')
    {
            flag |= exit(t - 1,  sx, sy - 1);
    }

    //move lower
    if (!flag && sy != n - 1 && c[sy + 1][sx] != 'X')
    {
            flag |= exit(t - 1,  sx, sy + 1);
    }

    //move left
    if (!flag && sx != 0 && c[sy][sx - 1] != 'X')
    {
            flag |= exit(t - 1, sx - 1, sy);
    }

    //move right
    if (!flag && sx != m - 1 && c[sy][sx + 1] != 'X')
    {
            flag |= exit(t - 1,  sx + 1, sy);
    }

    c[sy][sx] = '.';
    return flag;
}

int main()
{
    while (scanf("%d%d%d", &n, &m, &t) != EOF)
    {
        if (!n && !m && !t)
            break;

        dis = 0;

        for (int i = 0; i < n; i++)
        {
            scanf("%s", c[i]);
            for (int j = 0; j < m; j++)
            {
                if (*(c[i] + j) == 'S')
                {
                    sx = j;
                    sy = i;
                }
                if (*(c[i] + j) == 'D')
                {
                    dx = j;
                    dy = i;
                }
            }
        }


        if (sx < dx)    
        {
            dis += dx - sx;
        }
        else
            dis += sx - dx;

        if (sy < dy)    
        {
            dis += dy - sy;
        }
        else
            dis += sy - dy;

        //多餘步數是奇數則必定無法達到
        if ((t - dis) % 2)
        {
            printf("NO\n");
            continue;
        }

    
        if (exit(t,  sx, sy))
            printf("YES\n");
        else
            printf("NO\n");


    }
}

1016

1.先建立質數表
2.每次新加入一個元素時,依次嘗試質數表中的每個質數減上一個元素(如果超出範圍則放棄,如果已經存在則放棄)
3.每層dfs後要erase掉末尾元素
4.注意每行輸出最後沒有空格,否則PE

#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>

using namespace std;


vector<int> primeList;
vector<int> circle;
int num;

void primeSearch(int n)
{
    primeList.push_back(3);

    for (int i = 5; i < n; i += 2)
    {
        for (vector<int>::iterator it = primeList.begin(); *it <= sqrt(i); it++)
        {
            if (i % *it == 0)
                goto C;
        }
        primeList.push_back(i);
    C:;
    }
}

bool prime(int n)
{
    for (vector<int>::iterator it = primeList.begin(); it != primeList.end(); it++)
        if (*it == n)
            return true;
    return false;
}


void dfs(int n, int lastval)
{
    if (!n && prime(*(circle.end() - 1) + 1))
    {
        for (vector<int>::iterator it = circle.begin(); it != circle.end() - 1; it++)
            printf("%d ", *it);
        printf("%d\n", *(circle.end() - 1));
        return;
    }

    for (vector<int>::iterator it = primeList.begin(); it != primeList.end(); it++)
    {
        int thisval = *it - lastval;
        if (thisval < 1)
            continue;
        if (thisval > num)
        {
            break;
        }

        for (vector<int>::iterator it2 = circle.begin(); it2 != circle.end(); it2++)
        {
            if (*it2 == thisval)
                goto C;
        }

        circle.push_back(thisval);
        dfs(n - 1, thisval);
        circle.erase(circle.end() - 1);
    C:;
    }


}

int main()
{
    primeSearch(40);
    int i = 0;
    circle.push_back(1);
    while (scanf("%d", &num) != EOF)
    {
        i++;
        if (num % 2)
        {
            printf("Case %d:\n\n", i);
            continue;
        }
        printf("Case %d:\n", i);
        dfs(num - 1, 1);
        printf("\n");
    }

    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章