程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4294 Multiple 搜索

hdu 4294 Multiple 搜索

編輯:C++入門知識

假設a,aa,aaa……一直下去,對n取模,一定會出現循環,也就是會有aaaa…aaa和aaa…aa對n取模相同,那麼把他們相減得到aaaa…0000,則只出現了2個數字得到了n的倍數。這種方法雖然不是最優,但保證了不同的數不會超過2種,所以可以直接搜索。

枚舉所有組合(首先枚舉只出現1種數字,再枚舉出現2種的),然後搜索就夠了,判重時用余數判重。

注意得到答案後要進行字典序比較。

此題不用把字符串保存在隊列中,直接維護父親節點的路徑和信息,然後最後一次遞歸取出。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
#define M 10001
int fa[M],pa[M],vis[M];
char s[M];
int top;
int anstop;
char ans[M];
char tmp[M];
int n,m;
void print(int k)
{
    if(k==0) return;
    print(fa[k]);
    s[top++]=pa[k];
}
void cmp()
{
    if(anstoptop)
    {
        for(int i=0;is[i])
        {
            for(int j=i;j Q;
bool bfs(int k1,int k2)
{
    top=0;
    if(k1+k2==0) return false;
    while(!Q.empty()) Q.pop();
    memset(vis,0,sizeof(vis));
    fa[0]=-1;
    Q.push(0);
    while(!Q.empty())
    {
        int t=Q.front();Q.pop();

        if(t||k1){
        int f=(t*m+k1)%n;
        if(!vis[f])
        {
            vis[f]=1;
            fa[f]=t;
            pa[f]=k1+'0';
            if(f==0)
            {
                print(fa[f]);
                s[top++]=pa[f];
                if(anstop==0) {anstop=top;for(int i=0;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved