杭电 1015 Safecracker

来源:互联网 发布:中国自由意志缺乏数据 编辑:程序博客网 时间:2024/06/05 06:51

一开始看这道题时发现这么多英文,一大堆字母数字,以为这道题很难。把题目看完以后发现就是一系列数字找满足条件的等式。本来打算用枚举法,但是根据做了这么多道题的经验。心里就直接否定了。想着这要直接循环做,要有5个循环,最后肯定超时。想了很久也没有一个头绪。然后网上找了一下发现还真是直接枚举的方法做,所以就顺着开始的思路往下写了如下代码

#include <iostream>  #include <cstring>  #include <algorithm>  using namespace std;int main(){    int tar;    char s[20], b[6];    int a[20],flag;        while (cin >> tar>> s && tar)        {            int length = strlen(s);            flag = 1;            for (int i = 0; i < length; i++)            {                a[i] = s[i] - 'A' + 1;            }            for (int i = 0; i < length; i++)                      for (int j = 0; j < length; j++)            if (j != i)                for (int k = 0; k < length; k++)                if ( k != j && k != i)                    for (int l = 0; l < length; l++)                        if (l != k && l != j && l != i)                        for (int m = 0; m < length; m++)                            {                        if(m != l && m != k && m != j && m != i &&                                    a[i] - a[j] * a[j] + a[k] * a[k] * a[k]                                    - a[l] * a[l] * a[l] * a[l]                            + a[m] * a[m] * a[m] * a[m] * a[m] == tar)                                            {                                                flag = 0;                                                b[0] = a[i] - 1 + 'A';                                                b[1] = a[j] - 1 + 'A';                                                b[2] = a[k] - 1 + 'A';                                                b[3] = a[l] - 1 + 'A';                                                b[4] = a[m] - 1 + 'A';                                            }                                        }            if (flag)                cout << "no solution" << endl;            else                cout << b << endl;        }    return 0;}

代入验证的数据集发现出现了乱码,最后发现字符串尾部应该有个’\0’作为字符串结尾标志,所以申请空间应该多申请一个。所以加了一行b[5]=’\0’;最后发现可以运行了。以为这一题就做完了,然后提交,发现竟然错了。一直找不到是啥原因。认真看了题目以后发现它只要最大的一组数据。所以加入了一个排序的功能。最后得到代码如下

#include <iostream>  #include <cstring>  #include <algorithm>  using namespace std;int main(){    int tar;    char s[20], b[6];    int a[20],flag;        while (cin >> tar>> s && tar)        {            int length = strlen(s);            flag = 1;            for (int i = 0; i < length; i++)            {                a[i] = s[i] - 'A' + 1;            }            sort(a, a + length);            for (int i = 0; i < length; i++)                          for (int j = 0; j < length; j++)                    if (j != i)                        for (int k = 0; k < length; k++)                            if ( k != j && k != i)                                for (int l = 0; l < length; l++)                                    if (l != k && l != j && l != i)                                        for (int m = 0; m < length; m++)                                        {                            if (m != l && m != k && m != j && m != i &&                                a[i] - a[j] * a[j] + a[k] * a[k] * a[k]                                    - a[l] * a[l] * a[l] * a[l]                                + a[m] * a[m] * a[m] * a[m] * a[m] == tar)                                            {                                                flag = 0;                                                b[0] = a[i] - 1 + 'A';                                                b[1] = a[j] - 1 + 'A';                                                b[2] = a[k] - 1 + 'A';                                                b[3] = a[l] - 1 + 'A';                                                b[4] = a[m] - 1 + 'A';                                                b[5] = '\0';                                            }                                        }            if (flag)                cout << "no solution" << endl;            else                cout << b << endl;        }    return 0;}

这样最后结果就通过了。

原创粉丝点击