2005百度之星程序设计大赛总决赛题目解答,请大家多提意见!!!

liu6272002 2006-03-28 10:58:52
这里是我花了两天时间做的这个程序,不知道是不是还有什么不正确的地方,请大家给我测试一下,看还有什么更好的意见,能够进一步提高程序的效率!可能需要花费一些时间才能看得明白,希望大伙放点耐心!
以下是我的源程序文件:
eight_diamonds.cpp
/****************************************************************************************
2005百度之星程序设计大赛总决赛题目
八方块移动游戏要求从一个含8个数字(用1-8表示)的方块以及一个空格方块(用0表示)
的3×3矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换,直至达到所定
义的目标状态,空格方块在中间位置时,有上、下、左、右4个方向可移动,在四个角落上有
2个方向可移动,在其它位置上有3个方向可移动。例如,假设一个3×3矩阵的
初始状态为:              
8 0 3
2 1 4
7 6 5
目标状态为:
1 2 3
8 0 4
7 6 5
则一个合法的移动路径为:
8,0,3,8,1,3,8,1,3,0,1,3,1,0,3,1,2,3
2,1,4,2,0,4,0,2,4,8,2,4,8,2,4,8,0,4
7,6,5,7,6,5,7,6,5,7,6,5,7,6,5,7,6,5
另外在所有可能的从初始状态到目标状态的移动路径中,步数最少的路径被称为最短路径;
在上面例子中最短路径为5,如果不存在从初始状态的任何路径,则称该组状态无解。
请设计算法找到从八方块的某初始状态到某目标状态的所有可能路径中的最短路径,并用C/C++实现。
输入数据程序需读入已被命名为start.txt的初始状态和已被命名为goal.txt的目标状态这两个文
件都由9个数字组成(0表示空格,1-8表示8个数字方块),每行3个数字,数字之间用空格隔开。
假定start.txt和goal.txt不会相同。
输出数据:如果输入数据有解,输出一个表示最短路径的非负的整数;如果输入数据无解,输出-1。
请在数字输出后再输出一回车换行符。
如果用            
7 8 4
3 5 6
1 0 2
替换上面的start.txt则输出21。
如果用            
7 5 2
0 6 3
4 1 8
替换上面的start.txt则输出-1。
程序在P42.8G的Linux机器上运行出正确结果不能超过10秒。
编制者:月夜弯刀-(湘南学院)
****************************************************************************************/
#include<fstream.h>
#include"stack.h"
extern const char *start="start.txt";
extern const char *goal="goal.txt";
const int M=200;
stack<int> process(10000);
int _0[2]={1,3};
int _1[3]={0,2,4};
int _2[2]={1,5};
int _3[2]={0,4};
int _4[4]={1,3,5,7};
int _5[3]={2,4,8};
int _6[2]={3,7};
int _7[3]={4,6,8};
int _8[2]={5,7};
int compare(int begin[],int end[])
{
for(int i=0;i<9;i++)
{
if(begin[i]!=end[i])return 0;
}
return 1;
}
void swap(int &a,int &b)
{
int c;
c=a;a=b;b=c;
}
void judgeable(int position,int &number)
{
//cout<<number<<endl;
//cout<<position<<endl;
//cout<<process.ReadTopSecond()<<endl;
int i=0;
switch(position)
{
case 0:
for(i=0;i<2;i++)
if(number<_0[i]&&_0[i]!=process.ReadTopSecond())
{
number=_0[i];
break;
}
break;
case 1:
for(i=0;i<3;i++)
if(number<_1[i]&&_1[i]!=process.ReadTopSecond())
{
number=_1[i];
break;
}
break;
case 2:
for(i=0;i<2;i++)
if(number<_2[i]&&_2[i]!=process.ReadTopSecond())
{
number=_2[i];
break;
}
break;
case 3:
for(i=0;i<2;i++)
if(number<_3[i]&&_3[i]!=process.ReadTopSecond())
{
number=_3[i];
break;
}
break;
case 4:
for(i=0;i<4;i++)
if(number<_4[i]&&_4[i]!=process.ReadTopSecond())
{
number=_4[i];
break;
}
break;
case 5:
for(i=0;i<3;i++)
if(number<_5[i]&&_5[i]!=process.ReadTopSecond())
{
number=_5[i];
break;
}
break;
case 6:
for(i=0;i<2;i++)
if(number<_6[i]&&_6[i]!=process.ReadTopSecond())
{
number=_6[i];
break;
}
break;
case 7:
for(i=0;i<3;i++)
if(number<_7[i]&&_7[i]!=process.ReadTopSecond())
{
number=_7[i];
break;
}
break;
case 8:
for(i=0;i<2;i++)
if(number<_8[i]&&_8[i]!=process.ReadTopSecond())
{
number=_8[i];
break;
}
break;
}
}
int main()
{
ifstream input_file;
int begin[9],end[9],temp=-1,count=0;
int judge[1000];
int zero_position;
int result=M;
int countpath=0;
input_file.open(start);
if(!input_file)
{
cout<<"Can not open start.txt file!"<<endl;
return 1;
}
for(int i=0;i<9;i++)
{
input_file>>begin[i];
if(begin[i]==0)zero_position=i;
}
input_file.close();
input_file.open(goal);
if(!input_file)
{
cout<<"Can not open goal.txt file!"<<endl;
return 1;
}
for(i=0;i<9;i++)input_file>>end[i];
input_file.close();
for(i=0;i<1000;i++)judge[i]=-1;
process.push(zero_position);
/*switch(zero_position)
{
case 0:judge[0]=1;
break;
case 1:judge[0]=0;
break;
case 2:judge[0]=1;
break;
case 3:judge[0]=0;
break;
case 4:judge[0]=1;
break;
case 5:judge[0]=2;
break;
case 6:judge[0]=3;
break;
case 7:judge[0]=4;
break;
case 8:judge[0]=5;
break;
}*///这段语句可有可无,因为在下面的换回语句里,begin[judge[count-1]]中的
//judge[count-1]在最后一个数弹出时process.ReadTop()=-1;
count++;
for(int j=0;;j++)
{
temp=judge[count];
judgeable(zero_position,judge[count]);
if(temp==judge[count])
{
out: process.pop();//弹出
swap(begin[process.ReadTop()],begin[judge[count-1]]);//换回来,还原
judge[count]=-1;
count--;
zero_position=process.ReadTop();
if(zero_position==-1)break;
}
else
{
process.push(judge[count]);//压入
swap(begin[zero_position],begin[judge[count]]);//交换
zero_position=judge[count];
count++;
if(compare(begin,end))
{
if(result>count-1)
result=count-1;
countpath++;
cout<<"第"<<countpath<<"种可能路径:";
process.OutputAllData();
cout<<"共需:"<<result<<"步!"<<endl;
goto out;
}
if(count-1>=result)goto out;
}
}
cout<<"循环次数:"<<j<<endl;
if(result==M)cout<<"无解!"<<endl;
else cout<<"最短路径为:"<<result<<endl;
return 1;
}
stack.h
#include<assert.h>
#include<iostream.h>
template<class Type>class stack
{
public:
stack(int=10);
~stack(){delete[] elements;}
void push(const Type& item);
Type pop();
Type GetTop();
Type ReadTopSecond();
Type ReadTop();
void OutputAllData();
void MakeEmpty(){top=-1;}
int IsEmpty()const{return top==-1;}
int IsFull()const{return top==maxSize-1;}
private:
int top;
Type *elements;
int maxSize;
};
template<class Type>stack<Type>::stack(int s):top(-1),maxSize(s)
{
elements=new Type[maxSize];
assert(elements!=0);
}
template<class Type>void stack<Type>::push(const Type& item)
{

assert(!IsFull());
//cout<<"压入:"<<item<<endl;
elements[++top]=item;
}
template<class Type>Type stack<Type>::pop()
{

assert(!IsEmpty());
//cout<<"弹出:"<<elements[top]<<endl;
return elements[top--];
}
template<class Type>Type stack<Type>::GetTop()
{
assert(!IsEmpty());
return elements[top];
}
template<class Type>Type stack<Type>::ReadTopSecond()
{
if(top-1<0)return -1;
else return elements[top-1];
}
template<class Type>Type stack<Type>::ReadTop()
{
if(top<0)return -1;
else return elements[top];
}
template<class Type>void stack<Type>::OutputAllData()
{
for(int i=0;i<=top;i++)
{
cout<<elements[i]+1;
if(i<top)cout<<"->";
}
//cout<<endl;
}
用的是文件输入输出,这就是全部的源程序了。
请大伙发表意见吧!
...全文
1701 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiyujie87 2006-07-02
  • 打赏
  • 举报
回复
up
jxegong 2006-06-30
  • 打赏
  • 举报
回复
有意思
avril1986swj 2006-06-30
  • 打赏
  • 举报
回复
UP UP LZ
sleepingarie 2006-06-30
  • 打赏
  • 举报
回复
mark
zsl6658 2006-06-29
  • 打赏
  • 举报
回复
是不是可以用一个优先队列,将初始状态假如,然后再判断相邻的可行状态中的最佳状态,这里的最佳我想应该用错位数最少来定义.依次搜索,知道找到最终状态.
这是我的想法!呵呵!
xuelong_zl 2006-06-19
  • 打赏
  • 举报
回复
to : beingstudio(郁郁仔(http://blog.csdn.net/beingstudio/))

好理解也是不错呀,有机会帖上来给大家学一学如何?
crazy_lazy_pig 2006-06-18
  • 打赏
  • 举报
回复
mark
beingstudio 2006-06-18
  • 打赏
  • 举报
回复
的确是牛人
不过这个题有个简单的办法,但时间不是最省得,但好理解哦,编程想过但没写,仅仅把构思写本子上了
把数字排序为12368745就可以了
jinfengbj010 2006-06-08
  • 打赏
  • 举报
回复
牛人~
mssco 2006-06-08
  • 打赏
  • 举报
回复
mark
geniuscaobo 2006-06-01
  • 打赏
  • 举报
回复
学习 学习
welfarefanwei 2006-05-28
  • 打赏
  • 举报
回复
Good!
heavenchang 2006-05-07
  • 打赏
  • 举报
回复
mark
k04 2006-04-04
  • 打赏
  • 举报
回复
北京奥赛尔科技发展有限公司,
北京奥赛尔生物工程技术有限公司位于
北京市中关村科技园海淀园区,是由海外留学
人员创建的一家高新技术企业 ,并被评为
中关村留学人员创业园优秀企业 。(www.allshare.com.cn)
地址:北京、海淀、上地信息路26号、中关村留学生创业大厦
Tel : 010-82898000; 13601182765; 13683076911

现因业务拓展,需要组建新的团队,招聘以下人员:

职务 名额 职务描述
--------------------------------------
1、美工 1名 软件界面设计
2、程序员 2名 Win32 API + C\C++
3、数据库管理员 1名 Oracle;
SQL Sever 2000
sjjf 2006-04-02
  • 打赏
  • 举报
回复
先mark再说
longge520 2006-04-02
  • 打赏
  • 举报
回复
mark
OpenHero 2006-04-01
  • 打赏
  • 举报
回复
人工智能里面的路径规划
最简单的一个了:) 呵呵
Jiana 2006-04-01
  • 打赏
  • 举报
回复
人工智能的题。。。
sboom 2006-03-31
  • 打赏
  • 举报
回复
告诉我算法啊
iamcaicainiao 2006-03-31
  • 打赏
  • 举报
回复
收藏了先。
加载更多回复(48)
内容概要:本文提出了一种基于加权稀疏矩阵恢复与加速交替方向乘子法(ADMM)的单通道盲解混响算法,并提供了完整的Matlab代码实现。该方法旨在从仅有的单路接收信号中有效分离出原始声源信号,克服传统多通道方法对硬件的依赖。核心技术结合了信号在时频域的稀疏性先验,通过构建加权机制以增强稀疏矩阵恢复的准确性,并引入加速ADMM算法来优化求解过程,显著提升了算法的收敛速度与计算效率。该算法特别适用于麦克风阵列受限或无法部署的复杂声学环境,能够有效抑制混响干扰,从而显著提升语音信号的清晰度与后续语音识别系统的性能。; 适合人群:具备扎实的数字信号处理、凸优化理论及稀疏表示基础,从事音频信号处理、语音增强、盲源分离或相关领域研究与开发工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决单麦克风场景下的语音混响去除难题,提升语音通信质量;②应用于智能助听器、车载语音系统、远程视频会议、人机交互等存在严重混响的实际应用场景;③为盲解卷积、稀疏信号恢复等领域的研究提供一种高效的算法实现范例与优化思路。; 阅读建议:建议读者在深入理解信号稀疏性、ADMM优化框架等理论基础上,结合所提供的Matlab代码进行实践,重点分析加权策略的设计原理及其对恢复性能的影响,并通过调整正则化参数、权重因子等关键变量,探究其在不同混响强度和噪声条件下的鲁棒性与泛化能力。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧