• UVA 11198 Dancing Digits


    UVA_11198

        这个题目是个隐式图搜索的题目,可以把数值和符号分别存在两个数组里面,然后进行广搜即可。

    #include<stdio.h>
    #include
    <string.h>
    int st[50000][8],sign[50000][8],dis[50000];
    int head[1000003],next[50000];
    int target[8]={1,2,3,4,5,6,7,8};
    int isprime(int n)
    {
    int i;
    for(i=2;i<n;i++)
    if(n%i==0)
    return 0;
    return 1;
    }
    int hash(int *A)
    {
    int i,v=0;
    for(i=0;i<8;i++)
    v
    =10*v+A[i];
    return v%1000003;
    }
    int insert(int s)
    {
    int i,h;
    h
    =hash(st[s]);
    for(i=head[h];i!=-1;i=next[i])
    if(memcmp(st[i],st[s],sizeof(st[i]))==0)
    break;
    if(i==-1)
    {
    next[s]
    =head[h];
    head[h]
    =s;
    return 1;
    }
    else
    return 0;
    }
    int main()
    {
    int i,j,k,p,q,front,rear,t;
    t
    =0;
    while(1)
    {
    scanf(
    "%d",&st[0][0]);
    if(st[0][0]==0)
    break;
    if(st[0][0]<0)
    {
    st[
    0][0]=-st[0][0];
    sign[
    0][0]=0;
    }
    else
    sign[
    0][0]=1;
    for(i=1;i<8;i++)
    {
    scanf(
    "%d",&st[0][i]);
    if(st[0][i]<0)
    {
    st[
    0][i]=-st[0][i];
    sign[
    0][i]=0;
    }
    else
    sign[
    0][i]=1;
    }
    front
    =rear=0;
    memset(head,
    -1,sizeof(head));
    insert(rear);
    dis[rear]
    =0;
    rear
    ++;
    while(front<rear)
    {
    if(memcmp(st[front],target,sizeof(target))==0)
    break;
    for(i=0;i<8;i++)
    {
    for(j=0;j<i;j++)
    if((j!=0&&(sign[front][i]^sign[front][j-1])&&isprime(st[front][i]+st[front][j-1]))
    ||((sign[front][i]^sign[front][j])&&isprime(st[front][i]+st[front][j])))
    {
    memcpy(st[rear],st[front],
    sizeof(st[rear]));
    memcpy(sign[rear],sign[front],
    sizeof(sign[rear]));
    p
    =st[rear][i];
    q
    =sign[rear][i];
    for(k=i;k>j;k--)
    {
    st[rear][k]
    =st[rear][k-1];
    sign[rear][k]
    =sign[rear][k-1];
    }
    st[rear][j]
    =p;
    sign[rear][j]
    =q;
    if(insert(rear))
    {
    dis[rear]
    =dis[front]+1;
    rear
    ++;
    }
    }
    for(j=i+1;j<8;j++)
    if((j!=7&&(sign[front][i]^sign[front][j+1])&&isprime(st[front][i]+st[front][j+1]))
    ||((sign[front][i]^sign[front][j])&&isprime(st[front][i]+st[front][j])))
    {
    memcpy(st[rear],st[front],
    sizeof(st[rear]));
    memcpy(sign[rear],sign[front],
    sizeof(sign[rear]));
    p
    =st[rear][i];
    q
    =sign[rear][i];
    for(k=i;k<j;k++)
    {
    st[rear][k]
    =st[rear][k+1];
    sign[rear][k]
    =sign[rear][k+1];
    }
    st[rear][j]
    =p;
    sign[rear][j]
    =q;
    if(insert(rear))
    {
    dis[rear]
    =dis[front]+1;
    rear
    ++;
    }
    }
    }
    front
    ++;
    }
    printf(
    "Case %d: ",++t);
    if(front!=rear)
    printf(
    "%d\n",dis[front]);
    else
    printf(
    "-1\n");
    }
    return 0;
    }

      

  • 相关阅读:
    CRM更新行数量汇总的一些注意点
    [转]IT人从业方向
    地球撞击
    如何将Dynamic CRM Activities添加到VS工具箱
    linux本地 yum环境建立
    【转】根据条件修改GridView命令按钮显示的文字
    【转】Asp.net 2.0三层架构的构建与理解
    GridView的常用用法总结说明
    IE中的奇怪问题
    解决打不开 RSA 密钥容器 即:加密web.config中的内容
  • 原文地址:https://www.cnblogs.com/staginner/p/2180596.html
Copyright © 2020-2023  润新知