题意 求密文破解 有一段明文是一定会出现的
the quick brown fox jumps over the lazy dog // 有狗狗呦
能破解输出破解后的明文!否则输出
No solution.
算法:简单枚举
连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=791
#include <stdio.h>
#include <string.h>
#define MAX 105
int main ( )
{
int t;
scanf ( "%d\n", &t );
while ( t-- )
{
char str[MAX][MAX], visit[50];
strcpy ( visit, "the quick brown fox jumps over the lazy dog" );
int sum = 0, len = strlen ( visit ), hash[27] = { 0 };
bool flag = false;
while ( gets ( str[sum] ) )
if ( strlen ( str[sum] ) < 1 )
break;
else
sum++;
for ( int i = 0; i < sum; i++ )
{
int n = strlen ( str[i] );
memset ( hash, 0, sizeof hash );
if ( n != len )
continue;
for ( int j = 0; j < len; j++ )
{
if ( str[i][j] == ' ' && visit[j] == ' ' )
continue ;
if ( 'a' <= str[i][j] && str[i][j] <= 'z' && 'a' <= visit[j] && visit[j] <= 'z' )
if ( hash[str[i][j]-'a'+1] == 0 || hash[str[i][j]-'a'+1] == visit[j] - 'a' + 1 )
hash[str[i][j]-'a'+1] = visit[j] - 'a' + 1;
else
break;
else
{
if ( str[i][j] != visit[j] )
break;
}
}
flag = true;
for ( int k = 1; k < 26; k++ )
if ( !hash[k] )
flag = false;
if ( flag )
break;
}
if ( flag )
{
for ( int i = 0; i < sum; i++ )
{
len = strlen ( str[i] );
for ( int j = 0; j < len; j++ )
if ( str[i][j] == ' ' )
printf ( " " );
else
printf ( "%c", hash[str[i][j]-'a'+1] - 1 + 'a' );
puts ( "" );
}
}
else
puts ( "No solution." );
if ( t )
puts ( "" );
}
return 0;
}