1 条题解

  • 0
    @ 2025-8-24 22:05:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 引领天下
    用6年时间,讲好一个笑话。

    搬运于2025-08-24 22:05:09,当前版本为作者最后更新于2018-10-23 21:51:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    出题人来写一发题解

    此题主要就是搜索,为了提升难度,我还搞了一个恶心的读入

    接下来就是搜索了。

    具体码里说吧。

    #include <bits/stdc++.h>
    using namespace std;
    bool a[5][14];
    int ans,p,k,n,i,ant;
    char ch;
    string st;
    bool bb;
    bool check() {
        int i,j,t;
        bool b;
        for (j=1; j<=4; j++) {
            t=0;
            b=false;
            for (i=1; i<=k; i++)if (a[j][i])t++;
            i=0;
            if (t==1||t==13)continue;
            while (i<k) {
                i++;
                if (t==0)break;
                if (a[j][i]) {
                    t--;
                    if (b) continue;
                    else b=true;
                } else if (b)return false;
                else continue;
            }
        }
        return true;
    }//判断是否连续(即换完后是否可行)
    void check2() {
        int i,j,t,y;
        bool b;
        y=0;
        for (j=1; j<=4; j++) {
            t=0;
            for (i=1; i<=k; i++)if (a[j][i])t++;
            i=0;
            if (t==0||t==13||t==1) continue;
            b=false;
            while (i<k) {
                i++;
                if (t==0) break;
                if (a[j][i]) {
                    t--;
                    if (b) continue;
                    else b=true;
                } else if (b)y++;
                else continue;
            }
        }
        if (y<ant) ant=y;
    }//同上,另一个判断
    void search(int q,int b) {
        int i,j,o,y[5],w[5];
        if (q==k+1) {
            if (check()) {
                bb=true;
                if (ans>b) ans=b;
            }
            if (!bb) check2();
            return ;
        }
        search(q+1,b);
        j=0;
        for (i=1; i<=4; i++)
            if (a[i][q]) {
                j++;
                y[j]=i;
            } else {
                w[i-j]=i;
            }
        if (j==4||j==0)return ;
        if (j==1||j==3) {
            if (j==3) {
                for (o=1; o<=3; o++) {
                	if (a[i][j+1]&&a[i][j-1])continue;
       				if (!(a[o][j+1]||a[o][j-1]))continue;
                    a[w[1]][q]=true;
                    a[y[o]][q]=false;
                    search(q+1,b+1);
                    a[w[1]][q]=false;
                    a[y[o]][q]=true;
                }
            }
            if (j==1) {
                for (o=1; o<=3; o++) {
    			if (a[i][j+1]&&a[i][j-1])continue;
       			//if (!(a[o][j+1]||a[o][j-1]))continue;
                    a[w[o]][q]=true;
                    a[y[1]][q]=false;
                    search(q+1,b+1);
                    a[w[o]][q]=false;
                    a[y[1]][q]=true;
                }
            }
        } else {
            for (o=1; o<=2; o++) {
            	if (a[i][j+1]&&a[i][j-1])continue;
       			if (!(a[o][j+1]||a[o][j-1]))continue;
                a[w[o]][q]=true;
                a[y[1]][q]=false;
                search(q+1,b+1);
                a[w[o]][q]=false;
                a[y[1]][q]=true;
                a[w[o]][q]=true;
                if (a[i][j+1]&&a[i][j-1])continue;
    			if (!(a[o][j+1]||a[o][j-1]))continue;
                a[y[2]][q]=false;
                search(q+1,b+1);
                a[w[o]][q]=false;
                a[y[2]][q]=true;
            }
            a[w[1]][q]=true;
            a[y[1]][q]=false;
            a[w[2]][q]=true;
            a[y[2]][q]=false;
            search(q+1,b+2);
            a[w[1]][q]=false;
            a[y[1]][q]=true;
            a[w[2]][q]=false;
            a[y[2]][q]=true;
        }
    }//搜索,具体过程就是分类讨论,对每个牌的编号+1、-1进行搜索
    int main() {
        cin>>n;
        for (i=1; i<=n; i++) {
            cin>>p>>st;
            if (st=="A") {
                a[p][1]=true;
                if (1>k)k=1;
            }
            if (st=="2") {
                a[p][2]=true;
                if (2>k)k=2;
            }
            if (st=="3") {
                a[p][3]=true;
                if (3>k)k=3;
            }
            if (st=="4") {
                a[p][4]=true;
                if (4>k)k=4;
            }
            if (st=="5") {
                a[p][5]=true;
                if (5>k)k=5;
            }
            if (st=="6") {
                a[p][6]=true;
                if (6>k)k=6;
            }
            if (st=="7") {
                a[p][7]=true;
                if (7>k)k=7;
            }
            if (st=="8") {
                a[p][8]=true;
                if (8>k)k=8;
            }
            if (st=="9") {
                a[p][9]=true;
                if (9>k)k=9;
            }
            if (st=="10") {
                a[p][10]=true;
                if (10>k)k=10;
            }
            if (st=="J") {
                a[p][11]=true;
                if (11>k)k=11;
            }
            if (st=="Q") {
                a[p][12]=true;
                if (12>k)k=12;
            }
            if (st=="K") {
                a[p][13]=true;
                if (13>k)k=13;
            }//鬼畜的读入
        }
        ans=255;
        ant=255;
        search(1,0);
        if (bb) {
            puts("Yes");
            printf ("%d\n",ans);
        } else {
            puts("No");
            printf ("%d\n",ant);
        }//输出
    }
    

    另:请管理员改一下,这题真是我出的啊QAQ

    • 1

    信息

    ID
    3920
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者