经典搜索问题合集

题目链接:算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阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容