当前位置: 首页 > news >正文

八数码编码(优化数据结构,优化算法)

/*
重温八数码,优化算法
数据结构:一维数组。
          num[i]表示第i+1行第num[i]列有元素,通过对num[i]初始化进行排列即可模拟所有格局。如:num[0]=3,表示第一行第3列有元素。
核心算法:判断是否在对角即可(横向、纵向已经在数据结构设计中避开,免去判断)
          求下一排列
推广:在很多带回溯、递归的索搜,可试着用数组进行全排列并判断即可。
要点:熟悉掌握全排列算法。废话不多说,编译代码运行后逐步分析吧。
*/

#include<iostream>
using namespace std;

bool is_end(int *num,int len)
{
	for(int i = 0;i<len;i++)
	{
		if(num[i]!=len-i-1)
			return false;
	}
	return true;
}
bool check(int *num,int len)
{
	for(int i =0;i<len-1;++i)
	{
		for(int j = i+1;j<len;++j)
		{
			if(i-j==num[i]-num[j]||j-i==num[i]-num[j])
				return false;
		}
	}
	return true;
}

void print(int *num,int len)
{
	for(int i = 0;i<len;i++)
	{
		for(int j = 0;j<len;j++)
		{
			if(num[i] == j)
				cout<<"☆ ";
			else
				cout<<"■ ";
		}
		cout<<endl;
	}
}
void print_arrary(int *num,int len)
{
	for(int i = 0;i<len;i++)
		cout<<num[i];
	cout<<endl;
}
int* Permutation(int *a, int n)//求n位排列a的下一个排列
{
	int left = 0;
	int right = 0;
	int i = 1;
	 
		bool is_far = false;
		left = n - 1;                      
		while (left >= 0 && a[left-1] > a[left])  //找到 left = i = max{ i|pi-1<pi }
		{
			left--;
			if(left == 0)
			{
				is_far = true;
				break;
			}
		}
		if(is_end(a,n))   //没有下一序列了.
			return a; 
		right = n - 1;
		while (a[right] < a[left-1])       //找到right = l = max{k|P(left)<Pk} 
			right--;
		swap(a[right],a[left-1]);
		right = n -1;
		while (left < right)//逆置左右边界之间的元素,使其按增序排列
		{
			swap(a[right],a[left]);
			left++;
			right--;
		} 
	 return a;
}

int main()
{
	const int len = 8;     //数码的基数
	int *num = new int[len];
	int s = 1;
	for(int i = 0;i<len;i++)
		num[i] =i;
	while(!is_end(num,len))
	{
		if(check(num,len))
		{
			printf("第%d个解为:\n",s);
			print_arrary(num,len);
			print(num,len);
			cout<<endl;
			s++;
		}
		num = Permutation(num,len);
	}
	delete num;
	return 0;
}

相关文章:

  • mac 下 git svn 设置代理
  • 实时机票/火车票抓取系统整体架构
  • 我是伪程序员
  • asp.net实验一:hello world!
  • asp.net实验二:连接sql server 2008数据库
  • ASP.NET实验三:读取web.config连接数据库
  • 谷歌面试题(持续更新)
  • web前端实验一:利用Js捕获鼠标事件实现图片切换
  • web前端实验二:利用JS保护网页源代码
  • 五年专业编程的14个经验
  • 大数四则运算
  • JDBC学习之-Connection(一)
  • Linux实验二:Linux 内核模块测试
  • 套接字选项(getsockopt()与setsockopt())
  • Vim高级进阶之ex命令集
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • android图片蒙层
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • javascript从右向左截取指定位数字符的3种方法
  • Java基本数据类型之Number
  • Mithril.js 入门介绍
  • Otto开发初探——微服务依赖管理新利器
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • use Google search engine
  • vuex 学习笔记 01
  • vue学习系列(二)vue-cli
  • 分享几个不错的工具
  • 回顾2016
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 聊聊flink的TableFactory
  • 前端路由实现-history
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 协程
  • 学习笔记TF060:图像语音结合,看图说话
  • ionic入门之数据绑定显示-1
  • 回归生活:清理微信公众号
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (学习日记)2024.01.19
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .mysql secret在哪_MySQL如何使用索引
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net生成的类,跨工程调用显示注释
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @property python知乎_Python3基础之:property
  • @Transient注解
  • []常用AT命令解释()
  • [383] 赎金信 js
  • [Android Studio] 开发Java 程序
  • [Android] 修改设备访问权限
  • [Android]通过PhoneLookup读取所有电话号码
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [Flutter]打包IPA