Условие:http://acm.timus.ru/problem.aspx?space=1&num=1658
Очень интересная задачка ))
Я написал какую-то дикую динамику с очередями. (BFS с меморизацией)
Интересный момент - в этой задаче очень хорошо проявляется разница
между STL очередью и самописной.
STL очередь: Accepted, 0.203 с, 7 453 КБ
Самописная очередь: Accepted, 0.125 c, 13 597 КБ 11 строчка рейтинга "лучшие попытки"
Код:
#include <iostream> #include <queue> using namespace std; char sq[10] = {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}; char l[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; char d[901][8101]; queue <short int> q1; queue <short int> q2; int qps=0; char vec[10000]; int vp=0; void ans(int &a, int &b){ // Сбор ответа по родителям vp=0; while(d[a][b]){ vec[vp]=d[a][b]; vp++; qps=d[a][b]-48; a-=qps; b-=sq[qps]; } if(vp>100){ printf("No solution\n"); }else { while(vp){ vp--; printf("%c",vec[vp]); } printf("\n"); } } int main(){ short int a,b,o,p; q1.push(0); q2.push(0); while(!q1.empty()){ //Собственно BFS, рассчитывает ответы сразу для всех возможных случаев a=q1.front(); b=q2.front(); q1.pop(); q2.pop(); for(int i=1;i<10;i++){ //По идее, в этом месте i++ делается ~15 000 000 раз. Замена на ++i замедляет (!!!!!!) на 0.02 с. o=a+i; p=b+sq[i]; if(o<901 && p<8101 && !d[o][p]){ d[o][p]=l[i]; q1.push(o); q2.push(p); } } } int t; int e,f; scanf("%d",&t); for(int test=0;test<t;test++){a scanf("%d%d",&e, &f); if(e == 0 && f == 0){ printf("0\n"); }else if(e == 0 || f ==0){ printf("No solution\n"); }else if(e > 900 || f > 8100 || !d[e][f]){ printf("No solution\n"); }else ans(e,f); } return 0; }