蓝桥杯备赛打卡Day22

蓝桥杯每日一题
1.复习并查集和连通块中点的数量
2.奶酪(两种解法)
3.格子游戏

以下是部分题目的代码

//奶酪
//解法一(并查集)
typedef long long ll;//注意要用long long类型
const ll N = 1010;
ll t, n, h, r;
ll ne[N];

struct P
{
	ll x, y, z;
}p[N];

ll find(ll x)
{
	if (ne[x] != x)
		ne[x] = find(ne[x]);
	return ne[x];
}

bool is_llersect(ll i, ll j)
{
	ll dist = (p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y) + (p[i].z - p[j].z) * (p[i].z - p[j].z);
	if (dist <= r * r * 4) return true;//取等
	return false;
}

bool check()
{
	for (ll i = 1; i <= n; i++)
	{
		for (ll j = i + 1; j <= n; j++)
		{
			if (p[i].z + r < p[j].z - r) break;//显然j后面的不可能与i相交,break

			if (is_llersect(i, j))
			{
				ll pa = find(i), pb = find(j);
				if(pa!=pb) ne[pa] = pb;
			}
		}
	}

	for (ll i = 1; i <= n; i++)//遍历z小且接触下表面的洞
	{
		if (p[i].z - r <= 0)
			for (ll j = n; j >= i; j--)//遍历z大的洞且接触上表面的洞,注意j>=i,即考虑一个洞即可洞穿整个奶酪的情况
				if (p[j].z + r >= h && find(i) == find(j)) return true;
	}

	return false;
}

int main()
{
	ios::sync_with_stdio(false);

	cin >> t;
	while (t--)
	{
		cin >> n >> h >> r;

		for (ll i = 1; i <= n; i++) ne[i] = i;//每次都要初始化

		for (ll i = 1; i <= n; i++)
		{
			ll x, y, z; cin >> x >> y >> z;
			p[i] = { x,y,z };
		}

		//排序
		sort(p + 1, p + n + 1, [&](P a, P b) {
			return a.z < b.z;
			});

		if (check()) cout << "Yes" << endl;
		else cout << "No" << endl;
	}


	return 0;
}


//奶酪
//解法二(BFS)
typedef long long ll;//注意要用long long类型
const ll N = 1010;
ll t, n, h, r, cur_h;
bool st[N];

struct P
{
	ll x, y, z;
}p[N];

bool is_intersect(ll i, ll j)
{
	ll dist = (p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y) + (p[i].z - p[j].z) * (p[i].z - p[j].z);
	if (dist <= r * r * 4) return true;//取等
	return false;
}

bool check()
{
	if (p[1].z - r > 0) return false;//连第一个都不符合要求则退出

	queue<int> q;

	//注意不只是弹入第一个!
	for (int i = 1; i <= n; i++)
	{
		if (p[i].z - r > 0) break;
		q.push(i);
		st[i] = true;
	}

	while (q.size())
	{
		int cur = q.front(); q.pop();

		cur_h = p[cur].z + r;
		if (cur_h >= h) return true;//如果当前高度已经达到h,则可退出

		for (int i = cur + 1; i <= n; i++)
		{
			if (p[cur].z + r < p[i].z - r) break;//显然i之后的不符合要求,马上退出
			if (st[i]) continue;//标记,减少重复入队

			if (is_intersect(cur, i))//相交的则加入队列
			{
				q.push(i);
				st[i] = true;
			}
		}
	}

	return false;
}

int main()
{
	ios::sync_with_stdio(false);

	cin >> t;
	while (t--)
	{
		cin >> n >> h >> r;
		memset(st, false, sizeof st);

		for (ll i = 1; i <= n; i++)
		{
			ll x, y, z; cin >> x >> y >> z;
			p[i] = { x,y,z };
		}

		//排序
		sort(p + 1, p + n + 1, [&](P a, P b) {
			return a.z < b.z;
			});

		if (check()) cout << "Yes" << endl;
		else cout << "No" << endl;
	}


	return 0;
}


//格子游戏
//思路:构成封闭圈的最后一条连线的两个点在同一个连通块
const int N = 210;
int n, m, p[N * N];

int find(int x)
{
	if (p[x] != x)
		p[x] = find(p[x]);
	return p[x];
}

int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> m;

	for (int i = 1; i <= n * n; i++) p[i] = i;

	int mark = 0;
	for (int i = 1; i <= m; i++)
	{
		int x1, y1; cin >> x1 >> y1;
		int x2 = 0, y2 = 0;
		string op; cin >> op;
		
		if (op == "D") x2 = x1 + 1, y2 = y1;
		else if (op == "R") x2 = x1, y2 = y1 + 1;

		int a = (x1 - 1) * n + y1, b = (x2 - 1) * n + y2;
		int pa = find(a), pb = find(b);
		if (pa == pb)
		{
			mark = i;
			break;
		}
		else p[pa] = pb;
	}

	if (mark) cout << mark << endl;
	else cout << "draw" << endl;

	return 0;
}
### 工创打卡UID代码实现 对于工创中的打卡系统,特别是涉及UID(唯一识别码)的处理,可以借鉴基于Python和Web自动化技术的方法。当涉及到具体的UID操作时,通常是指RFID卡或类似设所持有的唯一标识符。 在构建这样的系统时,如果采用类似于引用中提到的技术栈[^2],则可以通过ESP系列微控制器配合RFID-RC522模块完成物理卡片的信息读取工作。此过程主要集中在硬件层面上获取每张RFID标签独一无二的序列号即UID,并将其作为用户身份验证的一部分用于后续的数据处理逻辑之中。 而对于软件部分,在接收到由上述硬件传递过来的UID之后,则需编写相应的程序来进行数据解析、校验以及存储等操作。下面给出一段简化版的Python脚本示例,该脚本能模拟接收来自RFID阅读器传入的UID并执行简单的签到动作: ```python import mysql.connector from mfrc522 import SimpleMFRC522 # 假设使用的是mfrc522库来与RFID模块通信 reader = SimpleMFRC522() def check_in(uid): try: connection = mysql.connector.connect( host='localhost', user='root', password='', database='checkin_system' ) cursor = connection.cursor() query = """INSERT INTO attendance (uid, timestamp) VALUES (%s, NOW())""" value = (str(uid),) cursor.execute(query, value) connection.commit() print(f"User with UID {uid} has checked in successfully.") except Exception as e: print(e) finally: if(connection.is_connected()): cursor.close() connection.close() if __name__ == '__main__': while True: id, text = reader.read() check_in(id) ``` 这段代码展示了如何利用MySQL数据库保存每次成功的打卡记录,其中包含了从RFID卡上获得的UID信息。需要注意的是这只是一个非常基础的例子,实际应用场景下还需要考虑更多的安全性和功能性因素,比如防止重复提交、支持多用户并发访问等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值