p1403.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 64 行

CPP
64
字号
// zju 1403 Search

#include <stdio.h>
#include <string.h>

int     Target;
bool    Have [27];
int     Num [27] [5];
char    Data [30];
int     Ans [5] , Stack [5];


void    Prepare ()
{
        int     i , j;
        for ( i = 1; i < 27; i ++ ) Num [i] [0] = i;
        for ( i = 1; i < 5; i ++ )
                for ( j = 1; j < 27; j ++ )
                        Num [j] [i] = Num [j] [i - 1] * j;
}

bool    Search ( int depth , int get )
{
        int     i , Next;

        if ( depth == 5 ) {
                if ( get == Target ) {
                        for ( i = 0; i < 5; i ++ )
                                Ans [i] = Stack [i];
                        return true;
                }
                return false;
        }

        for ( i = 26; i; i -- ) if ( Have [i] ) {
                Have [i] = 0;
                Stack [depth] = i;
                if ( depth % 2 ) Next = get - Num [i] [depth];
                        else Next = get + Num [i] [depth];
                if ( Search ( depth + 1 , Next ) ) return true;
                Have [i] = 1;
        }
        return false;
}

main ()
{
        freopen ( "p.in" , "r" , stdin );
        freopen ( "p.out" , "w" , stdout );
        
        int     i , len;
        Prepare ();
        while ( scanf ( "%d" , & Target ) , Target ) {
                scanf ( "%s" , Data );
                len = strlen ( Data );
                memset ( Have , 0 , sizeof ( Have ) );
                for ( i = 0; i < len; i ++ ) Have [Data [i] - 'A' + 1] = 1;
                if ( Search ( 0 , 0 ) )
                        for ( i = 0; i < 5; i ++ ) printf ( "%c" , Ans [i] + 'A' - 1 );
                                else printf ( "no solution" );
                        printf ( "\n" );
        }
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?