pots

本文分享了使用广度优先搜索(BFS)解决容器倒水问题的经验,详细介绍了六种状态的操作过程,并通过代码实现展示了如何正确打印从起始状态到目标状态的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=3414

 由于一直没有好好掌握搜索, 所以经常遇到搜索题就挂了,老师让我们默写我都写不出来。为了准备蓝桥杯以及之后的比赛,我下定决心好好学, 恢复以前的状态。

题意:bfs + 路径打印, 六种状态:A fill, A drop, B fill, B drop, A pour B, B pour A,  广搜不多说,直接上代码。打印路径: 记录A B剩余水的状态, 以上一次A B 剩余水量作为其前区节点, 定义一个结构体储存剩余水量, 每一次操作状态, 以及步数。 我做这题时收获不小, 这道题让我掌握了一点bfs, 还有就是遇到了一个坑点, 然后一直很揪心。原来的方法,每一次第一个输出的总是fill(1),花了好久时间发现问题。  问题:由于广搜的起点并不是六种操作, 所以第一步的状态就不能常规解决。 后来我想到在dfs打印路径时, 可以做一个判断, 因为刚开始A B 都是没有水的, 所以第一步操作只能是 fill(1)或fill(2),于是输出前做一个判断就OK了。

代码:

#include <iostream>
#include <stdio.h>
#include <queue>
#include <cstring>
using namespace std;

const int maxn = 1e2 + 5;
struct pot {
	int k1, k2, op;
};
struct path{
	int x, y, op, step;
}path[maxn][maxn];
char str[][10] = { "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)",  "POUR(2,1)", "POUR(1,2)"};
int A, B, C;
bool judge[maxn][maxn];
void my_clear() {
	struct path h = {0, 0, 0, 0};
	memset(judge, 0, sizeof(judge));
	for (int i = 0; i < maxn; i++)
		for (int j = 0; j < maxn; j++)
		path[i][j]= h;

}
// 递归打印路径 
void dfs(int x, int y) {
	int a = path[x][y].x;
	int b = path[x][y].y;

	if (path[x][y].step == 0) { //输出第一次操作 
		if (a == A)
			cout << str[0] << endl;
		if (b == B)
			cout << str[1] << endl; 
		return;
	}
	dfs(a, b);
	cout << str[path[x][y].op]<<  endl;
}
void BFS(int v1, int v2, int L) {
	queue <pot> wat;
	pot start = {0, 0, 0};
	judge[0][0] = true;
	wat.push(start);
	while (!wat.empty()) {
		pot tep = wat.front();
		wat.pop();
		int temp;
		if (tep.k1 == L || tep.k2 == L) {
			cout << path[tep.k1][tep.k2].step << endl;
			dfs(tep.k1, tep.k2);
			return ;
		}
		for (int i = 0; i < 6; i++) {
			switch(i) {
					/*6种状态*/ 
					case 0 : start.k1 = v1, start.k2 = tep.k2; break;  			//A fill
					case 2 : start.k1 = 0, start.k2 = tep.k2; break;				//A empty
					case 1 : start.k1 = tep.k1; start.k2 = v2; break;			//B fill
					case 3 : start.k1 = tep.k1; start.k2 = 0; break;			//B empty
					case 5 : temp = tep.k1 + tep.k2 - v2;					//A -> B
					 		 if (temp > 0) {
					 				start.k1 = temp;
					 				start.k2 = v2;
					 			}
					 		 else {
					 				start.k1 = 0;
					 				start.k2 = tep.k1 + tep.k2;
					 			}
					break;
					case 4 : temp = tep.k1 + tep.k2 - v1;						// B -> A
				     		 if (temp > 0) {
								start.k2 = temp;
								start.k1 = v1;
								}
							 else {
								start.k2 = 0;
								start.k1 = tep.k1 + tep.k2;
								}
					break;
			}
			if (!judge[start.k1][start.k2]) {
				path[start.k1][start.k2].x = tep.k1;
				path[start.k1][start.k2].y = tep.k2;//记录前驱结点 
				path[start.k1][start.k2].op = i;
				path[start.k1][start.k2].step = path[tep.k1][tep.k2].step + 1;				
				judge[start.k1][start.k2] = true;
				
				wat.push(start);
			}
		}
	}
	cout << "impossible" << endl;
}
int main()
{
	while (cin >> A >> B >> C) {
		BFS(A, B, C);
		my_clear();
	}
	return 0;
}

<think>好的,用户想了解POTS电话系统的相关信息。首先,我需要回忆一下POTS的基本概念和结构。POTS是传统电话系统,属于模拟通信,使用双绞铜线连接。可能需要解释它的组成部分,比如本地环路、中心局交换机等。 然后,用户可能需要知道它的技术特点,比如频带范围、信令方式,以及供电方式。记得提到贝尔系统建立的规范和标准,比如300-3400Hz的语音频带。还有,供电方面,局端通过线路提供48V直流电,这对断电时保持通话很重要。 接下来,用户可能对优缺点感兴趣。优点比如可靠性高、兼容性好,缺点如带宽低、功能有限。这里需要对比现代VoIP,说明为什么POTS在紧急情况下更可靠。 应用场景方面,虽然逐渐被替代,但紧急电话、农村地区、传真等场景还在使用。需要举些例子,比如报警电话依赖POTS,因为断电时仍可用。 生成相关问题时,要考虑用户可能进一步想知道的内容,比如与VoIP的区别、工作原理细节、可靠性原因、现状如何,以及维护挑战。这些问题能帮助用户深入理解POTS的不同方面。 需要注意的是,用户可能对技术细节不熟悉,所以回答时要保持清晰,避免过于专业的术语,但也要准确。比如解释本地环路时,可以简单说明是用户到中心局的线路。同时,引用规范时要正确,比如ANSI T1.401标准。 最后,检查是否符合之前的系统级指令:行内公式用$...$,独立公式用$$...$$,但POTS相关内容可能不需要数学公式,不过如果有提到带宽范围,可以用$300-3400\text{Hz}$这样的格式。确保用中文回答,结构清晰,问题相关且能引导进一步学习。</think>### Plain Old Telephone Service (POTS) 电话系统介绍 Plain Old Telephone Service (POTS) 是传统模拟电话系统,自19世纪末发展至今,构成了现代通信网络的基础。其核心特征如下: #### 1. **系统架构** - **本地环路 (Local Loop)**:用户电话机通过双绞铜线连接到最近的**中心局 (Central Office, CO)**,这段线路称为"最后一公里",典型阻抗为$600\ \Omega$[^1]。 - **交换层级**:采用分级电路交换网络,包括本地交换局、长途交换中心等,使用SS7信令系统控制呼叫路由。 #### 2. **技术规范** - **频带范围**:语音信道带宽限制在$300-3400\ \text{Hz}$,由贝尔系统在20世纪40年代确立[^2] - **供电系统**:采用-48V直流幻象供电,通过线路为电话机提供工作电源,确保断电时仍可通话 - **信令方式**: - 脉冲拨号(旋转拨号盘)或DTMF双音多频 - 振铃电压为$90\ \text{VAC}$(20Hz) #### 3. **典型特性** | 特性 | 参数 | |-----------|------------------------| | 线路电压 | 挂机48V DC,摘机6-12V DC | | 环路电阻 | ≤1900Ω(ANSI T1.401标准)| | 传输损耗 | ≤8dB(用户端到交换局) | #### 4. **优缺点分析** - **优势**: - 高可靠性:无需外部电源即可工作 - 强兼容性:支持传真机、调制解调器等设备 - 低延迟:端到端模拟电路连接 - **局限**: - 带宽限制(仅3.1kHz) - 缺乏现代功能(如视频通话) - 维护成本高(铜线基础设施) #### 5. **应用场景** - **紧急通信**:911/110报警系统仍依赖POTS线路 - **农村地区**:缺乏宽带覆盖区域的通信保障 - **专用设备**:电梯紧急电话、金融交易终端等 ```mermaid graph LR A[用户电话机] -->|双绞铜线| B(配线架) B --> C{分线盒} C --> D[中心局交换机] D -->|中继线路| E[PSTN网络] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值