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;}

原创粉丝点击