描述:坑人的一道题,不过也不难,就是数字交换,只有一正一负的数字才存在交换,并且交换之后不能形成素数
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define N 1000003
int t[10]= {1,2,3,4,5,6,7,8},cmp[]= {4,6,8,9,10,12,14,15};
int head[N],next[N],count[N];
int str[N][10][2];
int m=1,sum,flag;
int hash(int (*p)[2])
{int x=0;for(int i=0; i<8; i++)x=(x*10+p[i][0])%N;return x;
}
bool insert(int x,int rear)
{int c=head[x];while(c!=-1){int z=0;for(int i=0; i<8; i++)if(str[rear][i][0]!=str[c][i][0]){z=1;break;}if(z) c=next[c];else return false;}next[rear]=head[x];head[x]=rear;return true;
}
void bfs()
{memset(head,-1,sizeof(head));memset(next,-1,sizeof(next));memset(count,0,sizeof(count));flag=0;int rear=1,front=0;while(front<rear&&rear<N){for(int i=0; i<8; i++)for(int j=0; j<8; j++)if(str[front][j][1]+str[front][i][1]==1){int c=0;for(int k=0; k<8; k++) if(str[front][i][0]+str[front][j][0]==cmp[k]){c=-1;break;}if(c!=-1)//前插{if(j>i){for(int k=0; k<i; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=j; k<8; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i; k<j-1; k++){str[rear][k][0]=str[front][k+1][0];str[rear][k][1]=str[front][k+1][1];}str[rear][j-1][0]=str[front][i][0];str[rear][j-1][1]=str[front][i][1];}else{for(int k=0; k<j; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i+1; k<8; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i; k>j; k--){str[rear][k][0]=str[front][k-1][0];str[rear][k][1]=str[front][k-1][1];}str[rear][j][0]=str[front][i][0];str[rear][j][1]=str[front][i][1];}for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k]){flag=1;break;}if(!flag){sum=count[front]+1;return;}else{flag=0;int x=hash(str[rear]);if(insert(x,rear)){count[rear]=count[front]+1;rear++;}}}if(c!=-1)//后插{if(j>i){for(int k=0; k<i; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=j+1; k<8; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i; k<j; k++){str[rear][k][0]=str[front][k+1][0];str[rear][k][1]=str[front][k+1][1];}str[rear][j][0]=str[front][i][0];str[rear][j][1]=str[front][i][1];}else{for(int k=0; k<=j; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i+1; k<8; k++){str[rear][k][0]=str[front][k][0];str[rear][k][1]=str[front][k][1];}for(int k=i; k>j+1; k--){str[rear][k][0]=str[front][k-1][0];str[rear][k][1]=str[front][k-1][1];}str[rear][j+1][0]=str[front][i][0];str[rear][j+1][1]=str[front][i][1];}for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k]){flag=1;break;}if(!flag){sum=count[front]+1;return;}else{flag=0;int x=hash(str[rear]);if(insert(x,rear)){count[rear]=count[front]+1;rear++;}}}}front++;}
}
int main()
{// freopen("a.txt","r",stdin);while(scanf("%d",&str[0][0][0])!=EOF){if(!str[0][0][0]) break;flag=0;sum=-1;if(str[0][0][0]>0) str[0][0][1]=1;else{str[0][0][1]=0;str[0][0][0]=-str[0][0][0];}for(int i=1; i<8; i++){scanf("%d",&str[0][i][0]);if(str[0][i][0]>0) str[0][i][1]=1;else{str[0][i][1]=0;str[0][i][0]=-str[0][i][0];}}for(int i=0; i<8; i++)if(str[0][i][0]!=t[i]){flag=1;break;}if(flag){bfs();printf("Case %d: %d\n",m++,sum);}else printf("Case %d: 0\n",m++);}return 0;
}

11198 - Dancing Digits相关推荐

  1. UVA 11198 Dancing Digits

    UVA_11198 这个题目是个隐式图搜索的题目,可以把数值和符号分别存在两个数组里面,然后进行广搜即可. #include<stdio.h>#include<string.h> ...

  2. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  3. 浅入 dancing links x(舞蹈链算法)

    abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...

  4. 【转载】浅入 dancing links x(舞蹈链算法)

    转载自原文出处 浅入 dancing links x(舞蹈链算法) abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning ...

  5. dancing links(舞蹈链)——求解精准覆盖及重复覆盖问题

    以下转自:https://blog.csdn.net/the_star_is_at/article/details/53425736 问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果 ...

  6. Kuangbin专题三Dancing Links

    Kuangbin专题三Dancing Links 没写完所有的,因为要去上课了赶紧先预习一下,这就先发出来吧. 跳舞链这东西以前在hihocoder上翻到过,当时看的模模糊糊的,现在好好学一学. 暂时 ...

  7. Android Edittext digits 属性限制输入的内容

    digits属性中设置允许的字符,未允许的字符即使软键盘上有显示,点击后也无法显示到EditText中. 例如显示显示输入的内容为数字字母以及,和. 就可以使用如下 <EditTextandro ...

  8. python字符串常量_python教程---字符串常量ascii_letters、punctuation、digits、whitespace等...

    字符串常量 此模块中定义的常量为: string.ascii_letters 下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼连. 该值不依赖于语言区域. str ...

  9. [LeetCode] Add Digits

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

最新文章

  1. C++类构造函数中的成员初始化
  2. matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...
  3. java不抛出方法异常,java – 重写方法不会抛出异常
  4. 举例说明层次分析的三大原则_一起来复习下陈印老师关于多选题做题思路的分析...
  5. Windows 故障转移+Hyper-V 虚机自动迁移高 可用
  6. P4137 Rmq Problem / mex 主席树求mex
  7. 8.16模拟:树上算法
  8. 20155229 2016-2007-2 《Java程序设计》第一周学习总结
  9. Mavan学习之pom聚合
  10. 将string转换为char*
  11. IIS下载无后缀文件的设置
  12. C语言中如何使用system函数
  13. idea导出Oracle表结构和数据
  14. ArcGIS for Desktop 10.2安装破解与使用图文详解
  15. php 领红包程序,用PHP实现的抢红包小程序
  16. 阿里云CDN和全站加速区别在哪?使用有感
  17. 激光切割过程中遇到毛边怎么办?
  18. 相似度算法--莱文斯坦距离加入同义词逻辑
  19. 评论中发emoji表情 iOS
  20. 李宏毅2020作业3---CNN

热门文章

  1. 凤凰端子EN45545-2标准执行R24或者R26
  2. 双目视觉 1 双目视觉的原理
  3. httpd服务的配置
  4. 海豚浏览器推iOS V3.0,新增微博墙功能
  5. 关于 MVVM和MVC的一些总结
  6. seo站内优化的方法有哪些(站内优化和站外优化)
  7. 【性感玫瑰热门Win7主题】
  8. 站内优化不该只更新文章?你还可以这么做
  9. (摘自邀月csdn)SQL Server 2008 r2 安装过程图解
  10. 电脑开机后oracle中perl自启,PERL 引起Oracle数据库100% CPU