NEUQ-2021寒假训练-搜索

A - Prime Ring Problem

#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 20 + 5;
int a[maxn], vis[maxn];

int n, cas;

void init ();
bool p (int x);
void dfs (int u);

int main()
{
	while (~scanf ("%d", &n))
	{
		printf ("Case %d:\n", ++ cas);
		init ();
		dfs (1);
		putchar ('\n');
	}
	return 0;	
} 

void init ()
{
	a[0] = 1;
	memset (vis, 0, sizeof vis);
}

bool p (int x)
{
	if (x == 1) return 0;
	for (int i = 2; i * i <= x; i ++)
	{
		if (x % i == 0) return 0;
	}
	return 1;
}

void dfs (int u)
{
	if (u == n && p(1 + a[n - 1]))
	{
		printf ("%d", 1);
		for (int i = 1; i < n; i ++)
		{
			printf (" %d", a[i]);
		}
		putchar ('\n');
	}
	
	for (int i = 2; i <= n; i ++)
	{
		if (!vis[i] && p(a[u - 1] + i))
		{
			a[u] = i;
			vis[i] = 1;
			dfs (u + 1);
			vis[i] = 0;
		}
	}
}

B - 生日蛋糕

#include<iostream>
using namespace std;

const int inf = 0x3f3f3f;
const int maxn = 20 + 5;
int mins[maxn];
int minv[maxn];
int vol, flo;
int ans;

void dfs (int m, int sums, int sumv, int r, int h)
{
    if (m == 0)
    {
        if (sums < ans && sumv == vol)
        {
            ans = sums;
        }
        return;
    }
    
    if (mins[m] + sums > ans || minv[m] + sumv > vol)
    {
        return;
    }
    
    if (2 * (vol - sumv) / r + sums >= ans)
    {
        return;
    }
    
    for (int i = r - 1; i >= m; i --)
    {
        if (m == flo)
        {
            sums = i * i;
        }
        for (int j = h - 1; j >= m; j --)
        {
            dfs (m - 1, sums + i * j * 2, sumv + i * i * j, i, j);
        }
    }
}

int main()
{
    cin >> vol >> flo;
    
    for (int i = 1; i < maxn; i ++)
    {
        mins[i] = mins[i - 1] + i * i * 2;
        minv[i] = minv[i - 1] + i * i * i;
    }
    
    ans = inf;
    dfs (flo, 0, 0, 100, 10000);
    if (ans == inf)
    {
        ans = 0;
    }
    cout << ans << endl;
    
    return 0;
}

C - 放苹果

#include<iostream>
using namespace std;

int T, m, n;

int dfs (int m, int n)
{
    if (m == 0 || n == 1) return 1;
    if (m < n) return dfs (m, m);
    else return dfs (m, n - 1) + dfs (m - n, n);
}

int main()
{
    cin >> T;
    while (T --)
    {
        scanf ("%d %d", &m, &n);
        printf ("%d\n", dfs(m, n));
    }
    return 0;
}

D - Dungeon Master

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

const int maxn = 30 + 5;
char map[maxn][maxn][maxn];
int vis[maxn][maxn][maxn];
int l, r, c, sx, sy, sz, ex, ey, ez;
int to[6][3] = {{0,0,1}, {0,0,-1}, {0,1,0}, {0,-1,0}, {1,0,0}, {-1,0,0}};
 
struct node
{
    int x, y, z, step;
};
 
int check (int x,int y,int z)
{
    if(x < 0 || y < 0 || z < 0 || x >= l || y >= r || z >= c) return 1;
    if(map[x][y][z] == '#') return 1;
    if(vis[x][y][z]) return 1;
    return 0;
}
 
int bfs()
{
    queue <node> q;
    node a;
    a.x = sx;
	a.y = sy;
	a.z = sz;
	a.step = 0;
	q.push(a);
	
    vis[sx][sy][sz] = 1;
    
    while(!q.empty())
    {
        a = q.front();
        q.pop();
        
        if(a.x == ex && a.y == ey && a.z == ez) return a.step;
        
        for(int i = 0; i < 6; i ++)
        {
            node next = a;
            
            next.x = a.x + to[i][0];
            next.y = a.y + to[i][1];
            next.z = a.z + to[i][2];
            
            if(check(next.x, next.y, next.z)) continue;
            
            vis[next.x][next.y][next.z] = 1;
            next.step = a.step + 1;
            q.push (next);
        }
    }
    return 0;
}
 
int main()
{
    while (scanf("%d %d %d",&l, &r, &c), l + r + c)
    {        
		memset(vis, 0, sizeof vis);
        for(int i = 0; i < l; i ++)
        {
            for(int j = 0; j < r; j ++)
            {
                scanf("%s", map[i][j]);
                for(int k = 0; k < c; k ++)
                {
                    if(map[i][j][k] == 'S')
                    {
                        sx = i, sy = j, sz = k;
                    }
                    if(map[i][j][k] == 'E')
                    {
                        ex = i, ey = j, ez = k;
                    }
                }
            }
        }
        int ans = bfs();
        if(ans) printf("Escaped in %d minute(s).\n",ans);
        else printf("Trapped!\n"); 
    }
    return 0;
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页