Project Euler problem 61

来源:互联网 发布:微博个性域名怎么删除 编辑:程序博客网 时间:2024/05/22 13:51

题意很明了。


然后我大概的做法就是暴搜了

先把每个几边形数中四位数的处理出来。

然后我就DFS回溯着找就行了。

比较简单吧。


#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <vector>using namespace std;vector<int>g[7], v[7][10000];int vis[7];void get_three(){    for(int i = 1; ; i++)    {        int x = i * (i + 1) / 2;        if(x >= 10000) break;        if(x >= 1000) g[0].push_back(x);    }}void get_four(){    for(int i = 1; ; i++)    {        int x = i * i;        if(x >= 10000) break;        if(x >= 1000) g[1].push_back(x);    }}void get_five(){    for(int i = 1; ; i++)    {        int x = i * (3 * i - 1) / 2;        if(x >= 10000) break;        if(x >= 1000) g[2].push_back(x);    }}void get_six(){    for(int i = 1; ; i++)    {        int x = i * (2 * i - 1);        if(x >= 10000) break;        if(x >= 1000) g[3].push_back(x);    }}void get_seven(){    for(int i = 1; ; i++)    {        int x = i * (i * 5 - 3) / 2;        if(x >= 10000) break;        if(x >= 1000) g[4].push_back(x);    }}void get_eight(){    for(int i = 1; ; i++)    {        int x = i * (3 * i - 2);        if(x >= 10000) break;        if(x >= 1000) g[5].push_back(x);    }}int a[7];int ans;int flag;void dfs(int deep){    if(flag) return;    if(deep == 6)    {        if(a[5] % 100 == a[0] / 100)        {            flag = 1;            printf("%d\n", a[0] + a[1] + a[2] + a[3] + a[4] + a[5]);            return;        }    }    for(int i = 0; i < 6; i++)    {        if(!vis[i])        {            for(int j = 0; j < g[i].size(); j++)            {                int y = g[i][j];                if(!deep || y / 100 == a[deep - 1] % 100)                {                    vis[i] = 1;                    a[deep] = y;                    dfs(deep + 1);                    vis[i] = 0;                }            }        }    }}int main(){    get_three();    get_four();    get_five();    get_six();    get_seven();    get_eight();    dfs(0);    return 0;}