zoukankan      html  css  js  c++  java
  • 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;
    }

      

  • 相关阅读:
    POJ 2756 Autumn is a Genius 大数加减法
    RoboGuice注入框架简单应用
    Android 从相冊获取近期拍摄的多张照片(获取相机拍照所存储的照片)
    不可不知的DIP、IoC、DI以及IoC容器
    Codeforces Round #156 (Div. 2)---A. Greg&#39;s Workout
    zend framework将zip格式的压缩文件导入并解压到指定文件
    TreeSet排序
    Bee Framework_百度百科
    duck
    anglehack参赛总结
  • 原文地址:https://www.cnblogs.com/staginner/p/2180596.html
Copyright © 2011-2022 走看看