八数码(康托展开)
2016-05-13 15:18
288 查看
#include <iostream> #include <cstring> #define LEN 362888 //状态共9!=362880种 using namespace std; int dir[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}}; int visited[LEN]; //状态标记,步骤记录 int dis[LEN]; int state[LEN][9]; //状态池 int goal[9]; //目标状态 long int factory[]={1,1,2,6,24,120,720,5040,40320,362880}; bool Contor(int str[], int n) { long result = 0; for(int i = 0; i < n; i++) { int counted = 0; for(int j = i+1; j < n; j++) { if(str[i] > str[j]) //当前未出现的元素中是排在第几个 ++counted; } result += counted*factory[n-i-1]; } if(!visited[result]) //没有被访问过 { visited[result] = 1; return 1; } else return 0; } int bfs() { int head = 1, tail = 2; //为了节省空间,不用队列存储各个状态 int i; while(head < tail) //枚举完全部状态退出循环 { //到达目标状态 for(i = 0; i < 9; i++) { if(state[head][i] != goal[i]) break; } if(i == 9) return head; //找到元素0 for(i = 0; i < 9; i++) { if(state[head][i] == 0) break; } //转化为二维 int x = i/3; int y = i%3; int z = i; for(i = 0; i < 4; i++) { //新的坐标 int nx = x+dir[i][0]; int ny = y+dir[i][1]; //转化为一维 int nz = 3*nx+ny; if(nx >= 0 && nx < 3 && ny >= 0 && ny < 3) //未越界 { for(int j = 0; j < 9; j++) state[tail][j] = state[head][j]; swap(state[tail][z], state[tail][nz]); // for(int i = 0; i < 9; i++) // cout << state[tail][i] ; // cout << endl; dis[tail] = dis[head]+1; if(Contor(state[tail], 9)) //新状态未出现过 //cout << 1 << endl, tail++; //队列长度+1,相当于入队 } } head++; //队列长度-1,相当于出队 } return 0; } int main() { for(int i = 0; i < 9; i++) cin >> state[1][i]; //初始状态 for(int i = 0; i < 9; i++) cin >> goal[i]; //目标状态 int num = bfs(); if(num) cout << dis[num] << endl; else cout << "Impossible" << endl; return 0; }
相关文章推荐
- apache httpcompontens之HttpAsyncClient使用
- maven插件入门学习中碰到的问题解决
- windows下安装redis
- 用MediaRecoder类进行录制视频
- docker入门实战笔记
- svn提交报错:svn: Aborting commit:XXXXXremains in conflict
- javascript判断图片是否加载完成的方法推荐
- C语言第三次课
- VM扩展名类型
- 碰撞检测(上篇)
- 概要设计、详细设计:概念、方法、实践步骤
- 窗口类、窗口类对象与窗口 三者之间关系
- 得到屏幕的宽和高,然后在代码里面设置控件的宽和高,加载gif图片
- 实验三 进程调度模拟程序
- sqlserver配置邮件发送
- Java 组播发送数据和接受数据实例
- mysql 5.7.11 winx64安装配置方法图文教程
- android-小细节
- BZOJ 2929:[Poi1999]洞穴攀行
- javaweb总结(1)-web基础及tomcat环境搭建