3.21总结

 D - Shuffle'm Up

 

分析:

  •  建立题目需执行操作的函数,不断调用函数重复执行操作,直到s12达到要求,便结束函数,如果不能组成要求的字符串,因为组成的字符串是有限的,所以当新组成的字符串之前组成过,,便结束函数输出-1

  •     #include <set>

  • 用于使用`std::set`容器。`std::set`是C++标准库提供的关联容器,它内部自动排序存储元素,并且保证元素的唯一性,即相同元素不会重复存储。在这段代码中,`std::set`被用来存储字符串集合,确保集合中不会有重复的字符串。通过使用`std::set`,可以方便地进行元素的插入、查找和去重操作,适用于需要维护一组唯一元素的场景。

  • str.push_back(s2[i]); 

  • 是在C++中用于向字符串`str`的末尾添加字符的操作。具体来说,`push_back`是std::string`类的成员函数,用于将一个字符添加到字符串的末尾。在这里,`s2[i]`表示字符串`s2`中索引为`i`的字符,`push_back`将该字符添加到字符串`str`的末尾。通过这样的操作,可以逐个将`s2`中的字符添加到`str`中,用于生成新的字符串。

  • ss.insert(str)、ss.count(str)

  • 在C++中,`std::set`是一个关联容器,它提供了`insert`和`count`等方法来操作集合中的元素。

    1. `ss.insert(str)`:这个操作用于向`std::set`容器 `ss` 中插入元素 `str`。如果 `str` 在插入之前不存在于 `ss` 中,那么 `insert` 操作会将 `str` 插入到 `ss` 中;如果 `str` 已经存在于 `ss` 中,则 `insert` 操作不会有任何效果。这样可以确保 `set` 中的元素是唯一的,不会重复。

    2. `ss.count(str)`:这个操作用于统计 `std::set` 容器 `ss` 中等于 `str` 的元素的个数。由于 `set` 中的元素是唯一的,因此 `count` 方法的返回值要么是 0(表示 `str` 不在 `ss` 中),要么是 1(表示 `str` 在 `ss` 中)。

代码:

#include <iostream>
#include <set>
using namespace std;
set <string> ss;
string s12;
int len, ans;

void dfs(string s1, string s2, int n) 
{
    string str;
    for (int i = 0; i < len; i++) {
        str.push_back(s2[i]);
        str.push_back(s1[i]);
    }
    if (ss.count(str))
        return;
    ss.insert(str);
    if (str == s12) 
    {
        ans = n;
        return;
    }
    else {
        s1.clear();
        s2.clear();
        for (int i = 0; i < len; i++) 
        {
            s1.push_back(str[i]);
        }
        for (int i = len; i < len * 2; i++) 
        {
            s2.push_back(str[i]);
        }
        dfs(s1, s2, n + 1);
    }
}

int main() 
{
    string s1, s2;
    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) 
    {
        ss.clear();
        cin >> len;
        cin >> s1 >> s2 >> s12;
        ans = -1;
        dfs(s1, s2, 0);
        if (ans > 0) 
            ans++;
        cout << i << " " << ans << endl;
    }
    return 0;
}

 


 

E - Pots 

 

 分析:

  • BFS
  • 可以知道总共有6种操作方式,使用switch执行操作以及对操作的输出,g[tail].f用于储存所执行的方法,使用BFS搜索,直到其中一个罐子的水为C升,输出步数并对点进行回溯,查找达成要求所经历的步骤

代码:

#include<stdio.h>
int A, B, C, book[101][101],d[10000]={0};
struct nb
{
	int a;
	int b;
	int step;
	int ans;
	int f;
}g[10000000];
//FILL(1)  FILL(2) DROP(1)  DROP(2)  POUR(1, 2)  POUR(2, 1)
int main()
{
	int n=0;
	scanf("%d%d%d", &A, &B, &C);
	int tail, head, k;
	int x, y;
	head = tail = 1;
	g[tail].a = 0;
	g[tail].b = 0;
	g[tail].step = 0;
	g[tail].ans = 0;
	g[tail].f = 0;
	tail++;
	while (head < tail)
	{
		for (int i = 1; i <= 6; i++)
		{
			switch (i)    //6种操作
			{
			case 1:
				x = A;
				y=g[head].b;
				break;
			case 2:
				y = B;
				x=g[head].a;
				break;
			case 3:
				x = 0;
				y=g[head].b;
				break;
			case 4:
				y = 0;
				x=g[head].a;
				break;
			case 5:
				if (g[head].a + g[head].b > B)
				{
					x =g[head].a-( B - g[head].b);
					y = B;
				}
				else
				{
					y = g[head].a + g[head].b;
					x = 0;
				}
				break;
			case 6:
				if (g[head].a + g[head].b > A)
				{
					y =g[head].b-( A - g[head].a);
					x = A;
				}
				else
				{
					x = g[head].b + g[head].a;
					y = 0;
				}
				break;
			}
			if (book[x][y] == 1)
				continue;
			book[x][y] = 1;
			g[tail].a = x;
			g[tail].b = y;
			g[tail].f = head;
			g[tail].ans = i;   //储存到达当前情况所使用的步骤
			g[tail].step = g[head].step + 1;
			tail++;
			if (x == C || y == C)
			{
				printf("%d\n", g[tail-1].step);
				k = tail - 1;
				while (k)    //回溯,将达成目标的步骤找出来并存入新数组
				{
					d[n++]=g[k].ans;
					k = g[k].f;
				}
				for(int j=n-1;j>=0;j--)
				{
					switch (d[j])
					{
					case 1:
						printf("FILL(1)\n");
						break;
					case 2:
						printf("FILL(2)\n");
						break;
					case 3:
						printf("DROP(1)\n");
						break;
					case 4:
						printf("DROP(2)\n");
						break;
					case 5:
						printf("POUR(1,2)\n");
						break;
					case 6:
						printf("POUR(2,1)\n");
						break;
					}
				}
				return 0;
			}
		}
		head++;
	}
	printf("impossible\n");
	return 0;
}

 


 

 M - A计划

 分析:

  • BFS,需要注意的是如果传送门传送到的楼层的点是‘#’或‘*’,这个点就不走

 

代码:

#include<stdio.h>
#include<string.h>
int nx[] = { 0,1,0,-1 };
int ny[] = { 1,0,-1,0 };
int c, n, m, t, book[3][11][11];
char a[3][11][11];
struct nb
{
	int x;
	int y;
	int z;
	int t;
}g[300000];

int main()
{
	scanf("%d", &c);
	while (c--)
	{
		int k = 0;
		memset(book, 0, sizeof(book));
		scanf("%d%d%d", &n, &m, &t);
		for (int i = 0; i < 2; i++)
			for (int j = 0; j < n; j++)
			{
				scanf("%s", a[i][j]);
				getchar();
			}

		int tx, ty, tz, head, tail;
		head = tail = 1;
		g[head].z = 0;
		g[head].x = 0;
		g[head].y = 0;
		g[head].t = 0;
		book[0][0][0] = 1;
		tail++;
		while (head < tail)
		{
			for (int i = 0; i < 4; i++)
			{

				tx = g[head].x + nx[i];
				ty = g[head].y + ny[i];
				if (a[g[head].z][tx][ty] == '#')
				{
					if (g[head].z == 0)
						tz = 1;
					else
						tz = 0;
				}
				else
					tz = g[head].z;
				if (tz < 0 || tz >= 2 || tx < 0 || tx >= n || ty < 0 || ty >= m || book[tz][tx][ty] == 1 || a[tz][tx][ty] == '*'|| a[tz][tx][ty] == '#')
					continue;
				g[tail].z = tz;
				g[tail].x = tx;
				g[tail].y = ty;
				g[tail].t = g[head].t + 1;
				book[tz][tx][ty] = 1;
				if (a[tz][tx][ty] == 'P')
				{
					if (g[tail].t <= t)
						printf("YES\n");
					else
						printf("NO\n");
					k = 1;
					break;
				}
				tail++;
			}
			head++;
		}
		if (k == 0)
			printf("NO\n");
	}
	return 0;
}

 


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值