經典搜索問題合集

題目鏈接:算24點

bool zero(double x)
{
    if(fabs(x)<=eps)return true;
    return false;
}

bool equal_24(double a[],int n)
{
    if(n==1)
        if(zero(a[0]-24))return true;
        else return false;
    double b[5];
    for(int i=0; i<n-1; i++)
        for(int j=i+1; j<n; j++)
        {
            int cont=0;
            for(int k=0; k<n; k++)
                if(k!=i&&k!=j)b[cont++]=a[k];

            b[cont]=a[i]+a[j];
            if(equal_24(b,n-1))return true;

            b[cont]=a[i]-a[j];
            if(equal_24(b,n-1))return true;

            b[cont]=a[j]-a[i];
            if(equal_24(b,n-1))return true;

            b[cont]=a[i]*a[j];
            if(equal_24(b,n-1))return true;

            if(!zero(a[j]))
            {
                b[cont]=a[i]/a[j];
                if(equal_24(b,n-1))return true;
            }

            if(!zero(a[i]))
            {
                b[cont]=a[j]/a[i];
                if(equal_24(b,n-1))return true;
            }
        }
    return false;
}

int main()
{
    int T;
    double a[5];
    while(~scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3]))
    {
        if(zero(a[0])&&zero(a[1])&&zero(a[2])&&zero(a[3]))return 0;
        if(equal_24(a,4))printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

題目鏈接:經典n連環問題

int a[35],cont;

void dfs(int x,int op)
{
    if(a[x]==op)return;
    if(x==1&&a[1]==1-op)
    {
        a[1]=op;
        printf("第%d步: ",cont++);
        if(op==1)printf("把1套上\n");
        else printf("把1取下\n");
        return;
    }
    if(a[x-1]==0)dfs(x-1,1);
    for(int i=x-2; i>=1; i--)
        if(a[i]==1)dfs(i,0);
    a[x]=op;
    printf("第%d步: ",cont++);
    if(op==1)printf("把%d套上\n",x);
    else printf("把%d取下\n",x);
}

void init(void)
{
    cont=1;
    memset(a,0,sizeof(a));
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        init();
        for(int i=n; i>=1; i--)
            dfs(i,1);
    }
    return 0;
}

題目鏈接:標準數獨問題

int hang[15][15];
int lie[15][15];
int kuai[15][15];
char a[15][15];
int flag=0;

int judge(int x,int y)
{
    if(x>=1&&x<=3&&y>=1&&y<=3)return 1;
    if(x>=1&&x<=3&&y>=4&&y<=6)return 2;
    if(x>=1&&x<=3&&y>=7&&y<=9)return 3;
    if(x>=4&&x<=6&&y>=1&&y<=3)return 4;
    if(x>=4&&x<=6&&y>=4&&y<=6)return 5;
    if(x>=4&&x<=6&&y>=7&&y<=9)return 6;
    if(x>=7&&x<=9&&y>=1&&y<=3)return 7;
    if(x>=7&&x<=9&&y>=4&&y<=6)return 8;
    if(x>=7&&x<=9&&y>=7&&y<=9)return 9;
}

void init(void)
{
    for(int i=1; i<=9; i++)
        for(int j=1; j<=9; j++)
        {
            hang[i][a[i][j]-'0']=1;
            lie[j][a[i][j]-'0']=1;
            kuai[judge(i,j)][a[i][j]-'0']=1;
        }
}

void dfs(void)
{
    if(flag)return;
    int x,y,t;
    flag=1;
    for(int i=1; i<=9; i++)
        for(int j=1; j<=9; j++)
            if(a[i][j]=='0')
            {
                x=i;
                y=j;
                flag=0;
                break;
            }
    if(flag)
    {
        for(int i=1;i<=9;i++)
            printf("%s\n",a[i]+1);
        return;
    }
    t=judge(x,y);
    for(int i=1;i<=9;i++)
        if(!hang[x][i]&&!lie[y][i]&&!kuai[t][i])
        {
            a[x][y]=i+'0';
            hang[x][i]=1;
            lie[y][i]=1;
            kuai[t][i]=1;
            dfs();
            hang[x][i]=0;
            lie[y][i]=0;
            kuai[t][i]=0;
            a[x][y]='0';
        }
}


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(hang,0,sizeof(hang));
        memset(lie,0,sizeof(lie));
        memset(kuai,0,sizeof(kuai));
        for(int i=1; i<=9; i++)
            scanf("%s",a[i]+1);
        init();
        flag=0;
        dfs();
    }
    return 0;
}

題目鏈接:經典八數碼問題

int cont=1;
char ans[100000];
int dx[]={-3,-1,1,3};
char dop[]={'u','l','r','d'};
bool bo[10000000];
struct node
{
    int x[10];
    int pre,id;
    char op;
}a[362885];

ll qpow(int x,int y)
{
    ll res=1;
    while(y)
    {
        if(y&1)res*=x;
        y>>=1;x*=x;
    }
    return res;
}

bool vis(node y)
{
    ll res=0;
    for(int i=1;i<=9;i++)
        res+=(qpow(10,i-1)*y.x[10-i]);
    if(bo[res%9999991]==1)return false;
    bo[res%9999991]=1;
    return true;
}

int findzero(node y)
{
    for(int i=1;i<=9;i++)
        if(y.x[i]==0)return i;
}

queue<node>Q;

void bfs(void)
{
    int i;
    node t;
    while(!Q.empty())
    {
        t=Q.front();
        Q.pop();
        for(i=1;i<=8;i++)
            if(t.x[i]!=i)break;
        if(i==9)
        {
            int hh=0;
            while(t.pre!=0)
            {
                t=a[t.id];
                ans[hh++]=t.op;
                t.id=a[t.id].pre;
            }
            for(i=hh-1;i>=0;i--)
                printf("%c",ans[i]);
            printf("\n");
            return;
        }
        int zero=findzero(t);
        int zeromosan=zero%3;
        for(i=0;i<4;i++)
        {
            if(zeromosan==0&&i==2)continue;
            if(zeromosan==1&&i==1)continue;
            int now=zero+dx[i];
            if(now>=1&&now<=9)
            {
                a[cont]=t;
                swap(a[cont].x[zero],a[cont].x[now]);
                if(vis(a[cont]))
                {
                    a[cont].op=dop[i];
                    a[cont].pre=t.id;
                    a[cont].id=cont;
                    Q.push(a[cont]);
                    cont++;
                }
            }
        }
    }
    printf("unsolvable\n");
}

int main()
{
    char s[10][2];
    for(int i=1;i<=9;i++)
        scanf("%s",s[i]);
    for(int i=1;i<=9;i++)
        if(s[i][0]!='x')a[0].x[i]=(int)(s[i][0]-'0');
        else a[0].x[i]=0;
    a[0].id=0;
    a[0].pre=0;
    a[0].op=0;
    Q.push(a[0]);
    vis(a[0]);
    bfs();
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容