HDOJ 2043 password

刚開始看到这个题目的时候,就直接理解成仅仅要是长度符合要求而且字符符合要求,就是一个安全的password了,并没有考虑到至少要3种字符的组合。然后就直接写程序了(先暂且觉得题目就是那个意思),在測试的时候,发现竟然不符合我的要求(依照我的理解,password"[email protected]"是安全password,当然,依照题目的意思来理解,该password也是安全password),然后就一直找错误,找了半天都没发现错误,最后实在是没办法,就把脑袋当CPU来使吧,这下可好,发现原来是自己的逻辑出了错,就是在倒数第9行,我的意思是检查字符是否是数字和字母及特殊符号,假设不是的话,那么password就不安全了,否则就是安全的。为什么说逻辑出错了呢?就拿那个測试的数据来说吧,输入的password第一个字符是"L",那么那个isalnum函数返回的值是1,然后1不会等于0,所以第一个表达式的值为0,再然后就继续推断第二个表达式,显然"L"不是特殊字符,所以该表达式的值为假,所以整个表达的值为假,所以"[email protected]"是不安全的password,显然"L"是符合我们要求的。就算把第一个表达式的推断改为
isalum(S[i]) == 1也是没实用的,那么isalum返回的结果是1,因为是短路运算符,不再往后推断,然后1等于1,终于还是不安全的password,所以依照我的那个理解来写程序,这种算法是错误的,原因就是在推断的时候,还少了一些制约条件。关于依照我的那个理解应该怎么去写代码就不再说了,还是来看看题目真正的意思吧。

题目已经说了,password仅仅包括那4种合法的字符,所以我们没有必要再去检查字符的正确性。我们要做的就2件事,即检查password的长度和password字符种类的个数,长度非常好检查,关键就在于计算password字符种类个数的计算。我的思路是,用4个推断语句来推断字符的种类,假设符合对应的字符,那么计数器就自增一次,可是同样种类的字符出现的次数可能不止一次,所以这个计数器在自增后,就应该关闭它的自增功能,所以我定义该类型为结构体类型,用4个变量来计数,并用构造函数来实现自己主动初始化,最后仅仅要推断password字符种类的个数是不是大于等于3就可以。

#include <iostream>
#include <ctype.h>
#include <string.h>
#define MAX 50+2
using namespace std;
struct zi_fu
{
   int count;//计数器
   bool ji_shu;//计数器的开关
   zi_fu();//构造函数
};
zi_fu::zi_fu()
{
   count = 0;
   ji_shu = true;
}
int Is(char s)//推断是否是特殊字符
{
   string p ="[email protected]#$%^";
   for(int i=0; i<7; i++)
      if(s == p[i])
        return 1;
   return 0;
}
int main(void)
{
   int m;//測试数据的个数
   cin>>m;
   while(m--)
   {
      char s[MAX];
      memset(s,0,sizeof(s));//初始化password
      cin>>s;//输入password

      int len = strlen(s);
      if( !(8 <= len && len < 16 ))//假设长度不符合要求
      {
         cout<<"NO"<<endl;
         continue;
      }

      zi_fu xiao,da,shu,fu;//存储字母和符号种类的个数
      for(int i=0; i<len; i++)
      {
         if( islower(s[i]) && xiao.ji_shu )//小写
         {
            xiao.count++;
            xiao.ji_shu = false;
         }
         else if( isupper(s[i]) && da.ji_shu )//大写
         {
            da.count++;
            da.ji_shu = false;
         }
         else if( isdigit(s[i]) && shu.ji_shu )//数字
         {
            shu.count++;
            shu.ji_shu = false;
         }
         else if( Is(s[i]) && fu.ji_shu )//符号
         {
            fu.count++;
            fu.ji_shu = false;
         }
      }
      if(xiao.count + da.count + shu.count + fu.count >= 3)
        cout<<"YES"<<endl;
      else
        cout<<"NO"<<endl;
   }
   return 0;
}
时间: 2024-11-06 18:51:01

HDOJ 2043 password的相关文章

hdoj 2043密码

 首先,我们就要设置一个安全的密码.那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件: (1).密码长度大于等于8,且不要超过16. (2).密码中的字符应该来自下面"字符类别"中四组中的至少三组. 这四个字符类别分别为: 1.大写字母:A,B,C...Z; 2.小写字母:a,b,c...z; 3.数字:0,1,2...9; 4.特殊符号:~,!,@,#,$,%,^; 给你一个密码,你的任务就是判断它是不是一个安全的密码. Input 输入数据第一行包

hdoj:2043

#include <iostream> #include <string> using namespace std; bool judgeSize(string str) { int size = str.size(); if (size < 8 || size>16) return false; return true; } int isA(string str) { for (auto &c : str) { if (c >= 'A' &&am

输入password登录到主界面,录入学生编号,排序后输出

n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编号按字母顺序(由小到大)输出. 程序的功能要求例如以下: 1)  输入password"admin",正确则进入主界面,错误则直接推出(exit(0)): 2)从键盘输入5个学生编号"BJS1001","BJS2001"."BJS1011&

【HDOJ】4328 Cut the cake

将原问题转化为求完全由1组成的最大子矩阵.挺经典的通过dp将n^3转化为n^2. 1 /* 4328 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector>

关于JavaEE项目连接数据库提示 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)的解决方案

最近这三天,都在解决如下的问题:我MyEclipse中的JavaEE工程,运行之后就提示Access denied for user 'root'@'localhost' (using password: YES),当我用一个Java文件连接MySQL数据库时,没有任何问题.于是我在网上找了一些解决方案: (1)让root给当前用户授予增删改查的权限:grant select,insert,update,delete on *.* to 用户名@"%" Identified by &q

CentOS 7 / RHEL 7 : Reset / Recover forgotten root password

CentOS 7 / RHEL 7 : Reset / Recover forgotten root password October 11, 2014 by sharad chhetri 4 Comments In this post we will learn, how to reset / recover forgotten root password on CentOS 7 / RHEL 7 (Red Hat Enterprise Linux 7). On RHEL 5/6 or Cen

Reset root password in CentOS 7 / RHEL 7

There may be some occasion you will end up with requirement to reset the root password, the occasion comes when you forget root password; follow this guide to reset the password of root. In CentOS, single user mode will help us to achieve our goal of

How To Reset Your Forgotten Root Password On CentOS 7 Servers

Sometimes you forget stuff. I do. I forget important passwords for important websites sometimes. Retrieving your forgotten passwords for most websites is easy, all one has to do remember few details that were used when signing up for the service to g

POJ Xiangqi 4001 &amp;&amp; HDOJ 4121 Xiangqi

题目链接(POJ):http://poj.org/problem?id=4001 题目链接(HDOJ):http://acm.hdu.edu.cn/showproblem.php?pid=4121 Xiangqi Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1108   Accepted: 299 Description Xiangqi is one of the most popular two-player boa