烙饼排序问题最优次数求解 暑期学习笔记(九)
2008-08-21 00:53
393 查看
将直径不同的烙饼有序排列的问题,求取最优解需要的反转次数。
代码:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CakeSorting
{
class Program
{
private int[] cakeSizeArray;//大饼直径队列
private int[] cakeArray;//大饼队列
const int cakeNum = 5;
private int maxTime = 0;
static void Main(string[] args)
{
Program p = new Program();
p.run();
}
void run()
{
init();
search(0);
Console.WriteLine("maxtime is :{0}", maxTime);
Console.ReadLine();
}
void init()
{
//初始化赋值
maxTime = 2 * (cakeNum - 1);
cakeArray = new int[cakeNum];
cakeSizeArray = new int[cakeNum];
for (int i = 0; i < cakeSizeArray.Length; i++)
{
cakeSizeArray[i] = i;
}//大饼直径初始化
randomCollection();
//队列初始化完毕
}
void randomCollection()
{
if (cakeSizeArray.Length != cakeArray.Length)
return;
Random r = new Random();
for (int i = 0; i < cakeSizeArray.Length; i++)
{
cakeArray[i] = cakeSizeArray[0];
}
for (int i = 1; i < cakeSizeArray.Length; i++)
{
int address = r.Next(10);
for(;;)
{
if (address >= cakeSizeArray.Length)
address = 0;
if (cakeArray[address] != cakeSizeArray[0])
address++;
else
break;
}
cakeArray[address] = cakeSizeArray[i];
}
//打印结果
Console.WriteLine("Cake Array:");
for (int i = 0; i < cakeArray.Length; i++)
{
Console.Write("{0}\t", cakeArray[i]);
}
}
void search(int step)
{
if (step > maxTime)
return;//大于2(n-1)时退出
for (int i = 1; cakeArray [i-1]<cakeArray [i]; i++)
{
if (i == cakeArray.Length - 1)
{
maxTime = step;
return;
}
}//排序成功退出
for (int i = 0; i < cakeArray.Length; i++)
{
revert(0, i);
search(step+1);
revert(0, i);
}//递归穷举所有方案
}
void revert(int begin, int end)
{
int t = cakeArray[begin];
for (int i = begin, j = end; i < j; i++, j--)
{
t = cakeArray[i];
cakeArray[i] = cakeArray[j];
cakeArray[j] = t;
}
}
}
}
代码:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CakeSorting
{
class Program
{
private int[] cakeSizeArray;//大饼直径队列
private int[] cakeArray;//大饼队列
const int cakeNum = 5;
private int maxTime = 0;
static void Main(string[] args)
{
Program p = new Program();
p.run();
}
void run()
{
init();
search(0);
Console.WriteLine("maxtime is :{0}", maxTime);
Console.ReadLine();
}
void init()
{
//初始化赋值
maxTime = 2 * (cakeNum - 1);
cakeArray = new int[cakeNum];
cakeSizeArray = new int[cakeNum];
for (int i = 0; i < cakeSizeArray.Length; i++)
{
cakeSizeArray[i] = i;
}//大饼直径初始化
randomCollection();
//队列初始化完毕
}
void randomCollection()
{
if (cakeSizeArray.Length != cakeArray.Length)
return;
Random r = new Random();
for (int i = 0; i < cakeSizeArray.Length; i++)
{
cakeArray[i] = cakeSizeArray[0];
}
for (int i = 1; i < cakeSizeArray.Length; i++)
{
int address = r.Next(10);
for(;;)
{
if (address >= cakeSizeArray.Length)
address = 0;
if (cakeArray[address] != cakeSizeArray[0])
address++;
else
break;
}
cakeArray[address] = cakeSizeArray[i];
}
//打印结果
Console.WriteLine("Cake Array:");
for (int i = 0; i < cakeArray.Length; i++)
{
Console.Write("{0}\t", cakeArray[i]);
}
}
void search(int step)
{
if (step > maxTime)
return;//大于2(n-1)时退出
for (int i = 1; cakeArray [i-1]<cakeArray [i]; i++)
{
if (i == cakeArray.Length - 1)
{
maxTime = step;
return;
}
}//排序成功退出
for (int i = 0; i < cakeArray.Length; i++)
{
revert(0, i);
search(step+1);
revert(0, i);
}//递归穷举所有方案
}
void revert(int begin, int end)
{
int t = cakeArray[begin];
for (int i = begin, j = end; i < j; i++, j--)
{
t = cakeArray[i];
cakeArray[i] = cakeArray[j];
cakeArray[j] = t;
}
}
}
}
相关文章推荐
- 任意次序的n个烙饼最小反转次数求解 暑期学习笔记(十)
- 斯坦福机器学习-week 3 学习笔记(2)——Matlab最优问题求解
- 【机器学习-斯坦福】学习笔记7 - 最优间隔分类器问题
- MatLab建模学习笔记7——线性规划问题求解
- 【机器学习-斯坦福】学习笔记7 - 最优间隔分类器问题
- 学习笔记——求解素数问题之Eratosthenes(埃拉托色尼)筛选法
- MatLab建模学习笔记8——非线性规划问题求解
- matlab学习笔记之求解线性规划问题和二次型问题
- 算法设计和数据结构学习_3(《数据结构和问题求解》part2笔记)
- 【机器学习-斯坦福】学习笔记7 - 最优间隔分类器问题
- MatLab建模学习笔记9——二次规划问题求解
- MatLab建模学习笔记10——利用罚函数求解非线性规划问题
- Caffe学习笔记4--最优求解过程Solver
- 【R语言学习笔记】若干排序问题
- 《剑指Offer》学习笔记--面试题38:数字在排序数组中出现的次数
- 算法设计和数据结构学习_4(《数据结构和问题求解》part4笔记)
- 算法设计和数据结构学习_4(《数据结构和问题求解》part4笔记)
- 算法学习笔记——排序问题
- 算法设计和数据结构学习_3(《数据结构和问题求解》part2笔记)
- MatLab建模学习笔记10——利用罚函数求解非线性规划问题