洛谷B3843 [GESP202306 三级] 密码合规

(洛谷ID:vonNeumann)

解题思路


采用扫描法

  1. 遇到逗号跳过,记录逗号后的位置(begin)
  2. 跳过非逗号字符串(密码本身)
  3. 记录字符串结尾位置(end)
  4. 用string变量函数substr截取密码(begin~end),如果长度超过12 或者 低于6,跳过此密码
  5. 扫描密码。如果出现非法字符,跳过此密码;如果四大字符出现一个,将bool(flag)变量标true;如果出现大写字母,小写字母,数字,则将bool数组对应的一项标ture
  6. 扫描bool数组(不是变量),遇到一项ture,sum(记录true次数的整型变量)+1
  7. 如果flag为true,并且sum>=2,输出该密码

代码见下

#include <cstdio> 
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
bool zf[5];
int main()
{
	string x;
	cin>>x;
	int pos=0;
	int c=x.length();
	while (pos<c)
	{
		for (int i=0;i<3;i++)
			zf[i]=false;
		while (pos<c && x[pos]==',')
				pos++;
		int begin=pos;
		if (pos>c)
			break;
		while (pos<c && x[pos]!=',')
				pos++;
		if (pos>c)
			break;
		int end=pos;
		string key=x.substr(begin,end-begin);
		int len=key.length();
		if (len>=6 && len<=12)
		{
			bool flag=false;
			bool qj=false;
			for (int i=0;i<len;i++)
			{
				if (key[i]=='!' || key[i]=='@' || key[i]=='#' || key[i]=='$')
					flag=true;
				else if (key[i]>='a' && key[i]<='z')
						zf[0]=true;
					 else if (key[i]>='A' && key[i]<='Z')
					 			zf[1]=true;
						  else if (key[i]>='0' && key[i]<='9')
					 				zf[2]=true;
					 		   else
					 		   {
					 		   		qj=true;
					 		   		break;
								} 
			}
			if (qj)
				continue;
			int sum=0;
			for (int i=0;i<3;i++)
			{
				if (zf[i])
					sum++;
			}
			if (sum>=2 && flag)
				cout<<key<<'\n';
		} 
	}
	return 0;
 } 

<< B3843 密码合规是一道涉及字符串处理、条件判断以及规则匹配的问题。题目要求我们根据特定的密码策略检查给定的一组密码是否符合规定。 以下是对该题目的解答思路与完整代码: --- ### 解决方案 **题目分析:** 我们需要验证每个密码是否满足以下几个条件(假设这些是常见的密码复杂度需求): 1. 长度至少为 6 个字符。 2. 包含字母和数字,且必须同时包含大小写字母。 3. 不应包含空格或其他特殊字符。 4. 可能还有其他额外规则(具体依赖于实际题意说明)。 我们可以逐条编写逻辑来检测上述条件,并输出结果。 ```cpp #include <iostream> #include <string> using namespace std; bool isPasswordCompliant(const string& password) { if (password.length() < 6) return false; // 检查长度是否大于等于6 bool hasLower = false, hasUpper = false, hasDigit = false; for(char c : password){ if(islower(c)) hasLower = true; // 是否有小写字母 else if(isupper(c)) hasUpper = true; // 是否有大写字母 else if(isdigit(c)) hasDigit = true; // 是否有数字 if (!isalnum(c)) return false; // 如果出现非字母或数字直接返回false } return hasLower && hasUpper && hasDigit; // 必须同时包含小写、大写及数字 } int main(){ int n; cin >> n; while(n--){ string pwd; cin >> pwd; if(isPasswordCompliant(pwd)){ cout << "YES" << endl; }else{ cout << "NO" << endl; } } return 0; } ``` #### **解释** 1. `isPasswordCompliant` 函数用于判断一个密码是否合法。这个函数首先检查了密码长度是否小于6;接着初始化三个布尔值分别用来记录是否存在小写字母 (`hasLower`)、大写字母(`hasUpper`) 和 数字(`hasDigit`)。 2. 在遍历每一个字符时,使用 C++ 标准库中的 `islower`, `isupper`, `isdigit` 来分类标记相应的特征。如果发现任何非法字符(即不是字母也不是数字),立即返回 `false` 表示不合规。 3. 最后,在所有循环完成后,只有当这三种必需元素都存在的情况下才会返回真,否则判定此串不符合密码设定规范。 4. 主程序部分读取输入次数并逐一调用合法性校验器打印对应的结果“YES” 或者 “NO”。 --- ### 注意事项 - 输入可能含有空白行或者其他意外符号情况需特别注意过滤掉无效数据避免干扰最终判断依据。 - 对某些特殊情况如极端短密码等要确保算法健壮性能够正确应对边界测试样例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值