HNUSTOJ-1696 简单验证码识别(模拟)

来源:互联网 发布:三维测量仪编程教学 编辑:程序博客网 时间:2024/06/05 20:29

1696: 简单验证码识别

时间限制: 2 Sec  内存限制: 128 MB
提交: 148  解决: 44
[提交][状态][讨论版]

题目描述

验证码是Web系统中一种防止暴力破解的重要手段。其中,目前以静态图验证码应用最为广泛,但是由于一些验证码的设计者缺乏相关知识和经验,所以目前在用的很多验证码都可以被轻松攻破的(如图1中的验证码就很容易通许程序识别出上面的文字是”1234”)。那么就从它开始我们的验证码识别之旅吧~


图1

已知验证码图片由9*25的像素矩阵组成,每个验证码中包含4个数字字符,每个字符是1个7*5的像素矩阵(如下图2所示,其中每一个格表示1个像素点)。

另外,验证码的四周留有1像素宽度的空白,每个字符(点阵)间也有1列1像素宽度的空白隔开。


图2

成功识别出全部验证码的同学将获得Accept作为奖励~

输入

第1行包含一个数字N(N <= 50000),表示验证码的数量。

接下来将会跟着N个9*25的验证码像素矩阵(其中,”.”表示背景,”*”表示文字部分),每个验证码后面跟着一个空行。

输出

输出对应验证码上的字符,每个验证码占一行。

    

样例输入

2.............................*....*....***..*****....**...**...*...*.*.......*.*....*...*...*.****...*..*....*....****.....*..*****...*.......*.....*.....*....*......*..*...*.....*...***...**....***......................................................***....**...***.....*...*...*..*....*...*...**...*...*.*.........*..*.*....****.****.....*..*..*.......*.*...*...*...*****.....*..*...*..*.......*....**....***..*****....*...........................

样例输出

41959624

提示

来源

孙大川(出题)、樊劲宇(验题)

好像有点摸清这种题的套路了。。。

#include#include#includeusing namespace std;const char d[10][9][7]={{"......",".***..","*...*.","*..**.","*.*.*.","**..*.","*...*.",".***..","......"},{"......","..*...",".**...","..*...","..*...","..*...","..*...",".***..","......"},{"......",".***..","*...*.","....*.","...*..","..*...",".*....","*****.","......"},{"......","*****.","...*..","..*...","...*..","....*.","*...*.",".***..","......"},{"......","...*..","..**..",".*.*..","*..*..","*****.","...*..","...*..","......"},{"......","*****.","*.....","****..","....*.","....*.","*...*.",".***..","......"},{"......","..**..",".*....","*.....","****..","*...*.","*...*.",".***..","......"},{"......","*****.","....*.","...*..","..*...",".*....",".*....",".*....","......"},{"......",".***..","*...*.","*...*.",".***..","*...*.","*...*.",".***..","......"},{"......",".***..","*...*.","*...*.",".****.","....*.","...*..",".**...","......"}};char mat[9][26];const int cur[4]={1,7,13,19};int match(int x){    int i,j,k;    bool is_match;    for(i=0;i<10;i++){        is_match = true;        for(j=0;j<9 && is_match;j++)            for(k=0;k<6;k++){                if(d[i][j][k]!=mat[j][k+x]){ is_match = false; break;}            }        if(is_match) return i;    }    return -1;}int main(){    int T;    scanf("%d",&T);    while(T--){        for(int i=0;i<9;i++) scanf("%s",mat[i]);        for(int i=0;i<4;i++) printf("%d",match(cur[i]));        printf("\n");    }}