11198 - Dancing Digits
描述:坑人的一道题,不过也不难,就是数字交换,只有一正一负的数字才存在交换,并且交换之后不能形成素数
#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相关推荐
- UVA 11198 Dancing Digits
UVA_11198 这个题目是个隐式图搜索的题目,可以把数值和符号分别存在两个数组里面,然后进行广搜即可. #include<stdio.h>#include<string.h> ...
- 提取了下刘汝佳推荐的题号...
今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started 10055 - Hashmat the Brave Warrior ...
- 浅入 dancing links x(舞蹈链算法)
abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning links 算法,首先要先了解该算法适用的问题,精确覆盖问题和重复 ...
- 【转载】浅入 dancing links x(舞蹈链算法)
转载自原文出处 浅入 dancing links x(舞蹈链算法) abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题:以及重复覆盖问题. 要学习dacning ...
- dancing links(舞蹈链)——求解精准覆盖及重复覆盖问题
以下转自:https://blog.csdn.net/the_star_is_at/article/details/53425736 问题描述: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果 ...
- Kuangbin专题三Dancing Links
Kuangbin专题三Dancing Links 没写完所有的,因为要去上课了赶紧先预习一下,这就先发出来吧. 跳舞链这东西以前在hihocoder上翻到过,当时看的模模糊糊的,现在好好学一学. 暂时 ...
- Android Edittext digits 属性限制输入的内容
digits属性中设置允许的字符,未允许的字符即使软键盘上有显示,点击后也无法显示到EditText中. 例如显示显示输入的内容为数字字母以及,和. 就可以使用如下 <EditTextandro ...
- python字符串常量_python教程---字符串常量ascii_letters、punctuation、digits、whitespace等...
字符串常量 此模块中定义的常量为: string.ascii_letters 下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼连. 该值不依赖于语言区域. str ...
- [LeetCode] Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...
最新文章
- C++类构造函数中的成员初始化
- matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...
- java不抛出方法异常,java – 重写方法不会抛出异常
- 举例说明层次分析的三大原则_一起来复习下陈印老师关于多选题做题思路的分析...
- Windows 故障转移+Hyper-V 虚机自动迁移高 可用
- P4137 Rmq Problem / mex 主席树求mex
- 8.16模拟:树上算法
- 20155229 2016-2007-2 《Java程序设计》第一周学习总结
- Mavan学习之pom聚合
- 将string转换为char*
- IIS下载无后缀文件的设置
- C语言中如何使用system函数
- idea导出Oracle表结构和数据
- ArcGIS for Desktop 10.2安装破解与使用图文详解
- php 领红包程序,用PHP实现的抢红包小程序
- 阿里云CDN和全站加速区别在哪?使用有感
- 激光切割过程中遇到毛边怎么办?
- 相似度算法--莱文斯坦距离加入同义词逻辑
- 评论中发emoji表情 iOS
- 李宏毅2020作业3---CNN