算法竞赛入门经典:第七章 暴力求解法 7.20八数码问题之stl
来源:互联网 发布:车削编程 编辑:程序博客网 时间:2024/05/17 21:45
/*八数码问题之stl:1set<State> vis,这样只需要调用if(vis.count(s))来判断s是否在集合vis中,并用vis.insert(s)加入集合,用vis.remove(s)从集合中移除s。问题:并不是所有类型的State都可以作为set中的元素类型。set的元素必须定义"<"运算符,C语言原生的数组(包括字符数组)却不行。2如果数组不能转化为整数,自己声明结构体,重载函数调用符比较状态。下面中,整数a和b分别是两个状态在状态数组st中的下标,在比较时直接使用memcpy来比较整个内存块输入:2 6 4 1 3 7 0 5 88 1 5 7 3 6 4 0 2输出:31*//*关键:1set<State> vis,这样只需要调用if(vis.count(s))来判断s是否在集合vis中,并用vis.insert(s)加入集合,用vis.remove(s)从集合中移除s。问题:并不是所有类型的State都可以作为set中的元素类型。set的元素必须定义"<"运算符,C语言原生的数组(包括字符数组)却不行。2如果数组不能转化为整数,自己声明结构体,重载函数调用符比较状态。下面中,整数a和b分别是两个状态在状态数组st中的下标,在比较时直接使用memcpy来比较整个内存块。typedef struct Cmp{bool operator()(int iIndexA,int iIndexB) const//注意,容器中的比较函数用的是重载函数调用操作符,本质上仍然是比较操作3 int memcmp(const void* buf1,const void* buf2,size_t count)*/#include <stdio.h>#include <string.h>#include <set>using namespace std;#define MAXSIZE 1000000typedef int State[9];State st[MAXSIZE],stEnd;int iDist[MAXSIZE];set<int> setState;//这里穿入的是哈希值int go[][2] = {-1,0,1,0,0,-1,0,1};typedef struct Cmp{bool operator()(int iIndexA,int iIndexB) const//注意,容器中的比较函数用的是重载函数调用操作符,本质上仍然是比较操作{return memcmp(&st[iIndexA],&st[iIndexB],sizeof(st[iIndexB])) < 0 ;}}Cmp;set<int,Cmp> setState2;void init2(){setState2.clear();}bool isInsert2(int iIndex){if(setState2.count(iIndex)){return false;}else{setState2.insert(iIndex);return true;}}void init(){setState.clear();}bool isInsert(int iNum){int iSum = 0;for(int i = 0 ; i < 9; i++){iSum = iSum * 10 + st[iNum][i];}if(setState.count(iSum)){return false;}else{setState.insert(iSum);return true;}}int bfs(){int iFront = 1,iRear = 2;init2();while(iFront < iRear){State& state = st[iFront];if(memcmp(stEnd,state,sizeof(state)) == 0){return iFront;}int iX,iY,iZ;for(iZ = 0; iZ < 9 ; iZ++){if(!state[iZ])//这里不是st[iZ]{break;}}iX = iZ / 3;iY = iZ % 3;for(int i = 0 ; i < 4 ; i++){int iNewX = iX + go[i][0];int iNewY = iY + go[i][1];int iNewZ = iNewX * 3 + iNewY;if(iNewX < 3 && iNewX >= 0 && iNewY < 3 && iNewY >= 0){State& newState = st[iRear];//memcpy(newState,state,sizeof(state));memcpy(&newState,&state,sizeof(state));newState[iNewZ] = state[iZ];newState[iZ] = state[iNewZ];iDist[iRear] = iDist[iFront] + 1;if(isInsert2(iRear)){iRear++;}}}iFront++;}return -1;}void process(){iDist[1] = 0;for(int i = 0 ; i < 9; i++){scanf("%d",&st[1][i]);}for(int j = 0; j < 9; j++){scanf("%d",&stEnd[j]);}int iRes = bfs();if(iRes > 0){printf("%d\n",iDist[iRes]);}else{printf("-1\n");}}int main(int argc,char* argv[]){process();system("pause");return 0;}
0 0
- 算法竞赛入门经典:第七章 暴力求解法 7.20八数码问题之stl
- 算法竞赛入门经典:第七章 暴力求解法 7.18八数码问题之哈希去重
- 算法竞赛入门经典:第七章 暴力求解法 7.18 广度优先搜索之八数码问题
- 算法竞赛入门经典:第七章 暴力求解法 7.18倒水问题
- 算法竞赛入门经典第七章暴力求解法7.1节第一题
- 算法入门竞赛经典第七章暴力求解法7.1.1
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.2:枚举排列
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.3:子集生成
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.4:回溯法
- 算法竞赛入门经典:第七章 暴力求解法 7.1除法
- 算法竞赛入门经典:第七章 暴力求解法 7.2最大乘积
- 算法竞赛入门经典:第七章 暴力求解法 7.3分数拆分
- 算法竞赛入门经典:第七章 暴力求解法 7.4双基回文数
- 算法竞赛入门经典:第七章 暴力求解法 7.5枚举排列
- 算法竞赛入门经典:第七章 暴力求解法 7.6可重复的排列
- 算法竞赛入门经典:第七章 暴力求解法 7.7解答树
- 算法竞赛入门经典:第七章 暴力求解法 7.8子集生成
- 算法竞赛入门经典:第七章 暴力求解法 7.9位向量法
- Android 从一个Activity向另一个Activity传递一个对象
- word-shortcuts
- iOS开发 -- loadView方法
- 不要在Android的Application对象中缓存数据!
- TTS-零基础入门之停止列表中单条语音播报
- 算法竞赛入门经典:第七章 暴力求解法 7.20八数码问题之stl
- 握手定理
- Oracle Database 12c新特性 In-Database Archiving数据库内归档
- caffe caffe.cpp 程序入口分析
- Isomorphic Strings
- SWAP空间不足的处理方法
- 【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】
- android sharedPreference的用法
- 转:C语言中如何将二维数组作为函数的参数传递