HNUST 1696: 简单验证码识别。
来源:互联网 发布:男朋友要我穿丝袜知乎 编辑:程序博客网 时间:2024/06/05 03:33
1696: 简单验证码识别
时间限制: 2 Sec 内存限制: 128 MB提交: 150 解决: 46
[提交][状态][讨论版]
题目描述
验证码是Web系统中一种防止暴力破解的重要手段。其中,目前以静态图验证码应用最为广泛,但是由于一些验证码的设计者缺乏相关知识和经验,所以目前在用的很多验证码都可以被轻松攻破的(如图1中的验证码就很容易通许程序识别出上面的文字是”1234”)。那么就从它开始我们的验证码识别之旅吧~
图1
已知验证码图片由9*25的像素矩阵组成,每个验证码中包含4个数字字符,每个字符是1个7*5的像素矩阵(如下图2所示,其中每一个格表示1个像素点)。
另外,验证码的四周留有1像素宽度的空白,每个字符(点阵)间也有1列1像素宽度的空白隔开。
图2
成功识别出全部验证码的同学将获得Accept作为奖励~
输入
第1行包含一个数字N(N <= 50000),表示验证码的数量。
接下来将会跟着N个9*25的验证码像素矩阵(其中,”.”表示背景,”*”表示文字部分),每个验证码后面跟着一个空行。
输出
输出对应验证码上的字符,每个验证码占一行。
喵了个咪,这题不就是上次那个数字转字符的逆运算么,想了解的也可以翻翻我的博客(那个啥的烦恼http://blog.csdn.net/qq_36752486/article/details/77164161)咯。。。
思路:这题,或许新手一上来会有点懵逼,像我这样的老司机也是懵逼三十秒。。。其实也挺简单的,数字只有0到9十个,枚举一下就行了。首先我们是要区分这些字符的,显然区别越大,代码越短咯,上来看倒数第二行,比如2是全是*,和其他九个数都不同,所以同理,可以区分出2 ,4, 7 ,9.在除开这些数的情况下,我们在看第二行,同理可以区分 1 , 3 , 5, 6。。。最后剩下0 和8,看第三行就可以轻易区分了。。。
没错由以上思路就可以轻松编码了,但是我一些出来就不对了,居然输出了五个数。。。仔细看题目(另外,验证码的四周留有1像素宽度的空白,每个字符(点阵)间也有1列1像素宽度的空白隔开。)没错,然后浪费了我五分钟改。。。
所以看清楚题目很重要喔。。。贴代码咯
#include <iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<string>#include<cstdlib>using namespace std;typedef long long LL;char a[11][30];int main(){ int n; scanf("%d",&n); while(n--) { for(int i=0; i<=8; i++) ///第一行和第八行都是*,还是要读入 scanf("%s",a[i]); for(int i=0; i<19; i+=6) ///i为列号。 { if(a[7][i+1]=='*'&&a[7][i+2]=='*'&&a[7][i+3]=='*'&&a[7][i+4]=='*'&&a[7][i+5]=='*') printf("2"); else if(a[7][i+1]=='.'&&a[7][i+2]=='.'&&a[7][i+3]=='.'&&a[7][i+4]=='*'&&a[7][i+5]=='.') printf("4"); else if(a[7][i+1]=='.'&&a[7][i+2]=='*'&&a[7][i+3]=='.'&&a[7][i+4]=='.'&&a[7][i+5]=='.') printf("7"); else if(a[7][i+1]=='.'&&a[7][i+2]=='*'&&a[7][i+3]=='*'&&a[7][i+4]=='.'&&a[7][i+5]=='.') printf("9"); else if(a[2][i+1]=='.'&&a[2][i+2]=='*'&&a[2][i+3]=='*'&&a[2][i+4]=='.'&&a[2][i+5]=='.') printf("1"); else if(a[2][i+1]=='.'&&a[2][i+2]=='.'&&a[2][i+3]=='.'&&a[2][i+4]=='*'&&a[2][i+5]=='.') printf("3"); else if(a[2][i+1]=='*'&&a[2][i+2]=='.'&&a[2][i+3]=='.'&&a[2][i+4]=='.'&&a[2][i+5]=='.') printf("5"); else if(a[2][i+1]=='.'&&a[2][i+2]=='*'&&a[2][i+3]=='.'&&a[2][i+4]=='.'&&a[2][i+5]=='.') printf("6"); else if(a[3][i+4]=='*') printf("0"); else printf("8"); } printf("\n"); } return 0;}
- HNUST 1696: 简单验证码识别。
- 简单验证码识别
- 简单验证码识别
- 简单验证码识别
- 简单验证码识别
- 简单验证码识别
- 简单验证码识别
- HNUSTOJ-1696 简单验证码识别(模拟)
- 【图像识别】简单验证码识别
- 简单验证码的识别
- Python3简单验证码识别
- python简单验证码识别
- python简单验证码识别
- 识别简单的验证码
- python验证码简单识别
- [验证码]简单验证码识别
- 简单的图形验证码识别代码
- JavaSE图像验证码简单识别程序
- Spring boot 中文手册pdf
- jdbc动态加载jar包连接mysql和hive
- C++的粗略学习
- -Java-泛型
- 欢迎使用CSDN-markdown编辑器
- HNUST 1696: 简单验证码识别。
- Hive 基础介绍
- linux和windows文件大小写问题
- python访问mysql数据库
- MongoDB安装为service报错100(windows系统)
- 手把手教你如何玩转Spring
- [Leetcode]Single Number
- [FreeBSD] 安全加固
- 动态规划