呜呜...这段代码怎么改都改不正确.路过的好心人帮我看看.今晚弄不出来就挂了
其实是用VC.NET 写的.以下是Form1.h的内容#pragma once
namespace My8 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
int z=0;
int x=1;
int f[9999];
int fx[99];
struct str
{
int zt[3][3];
int g;
int h;
int fangxiang;
struct str *parent;
struct str *xiabu;
};
struct str open[9999];
int a[3][3]={1,2,3,8,9,4,7,6,5};
int c[9999][3][3];
void copy(int x,int z,int o)
{
int j;
int i;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(o==1) c[x][i][j]=open[z].zt[i][j];
else open[z].zt[i][j]=c[x][i][j];
}
}
}
void cmp()
{int i,j,k,flag=1;
for(k=0;k<x;k++)
{
flag=1;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(open[x].zt[i][j]!=open[k].zt[i][j])flag=0;
}
}
if(flag==1)
{
if(open[x].g<open[k].g&&f[k]!=9999)
{
open[k].g=open[x].g;
f[k]=f[x];
}
}
}
}
void fangxiang(void)
{struct str a;
int i;
a=*open[0].xiabu;
for( i=0;i<99;i++)
{
fx[i]=a.fangxiang;
if(a.h==0)return;
a=*a.xiabu;
}
}
int h(int x)
{
int count=0;
int i,j,m,n,han,lie;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
for(m=0;m<3;m++)
{
for(n=0;n<3;n++)
{
if(c[x][i][j]==a[m][n])
{han=(i-m>0)?i-m:m-i;
lie=(j-n>0)?j-n:n-j;
count=count+han+lie;
}
}
}
}
}
return count;
}
void ret(int z)
{ int k;
if(z==0) return;
for(k=0;k<9999;k++)
{
if(&open[k]==open[z].parent)
{
open[k].xiabu=&open[z];
ret(k);
}
}
}
int shuchu()
{
int tmp,i,j;
copy(0,0,0);
open[0].g=0;
for(i=0;i<9999;i++)
f[i]=65535;
while(1)
{
if(h(z)==0)
{
ret(z);
fangxiang();
return 0;
}
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
if(c[z][i][j]==9) break;
}
if(c[z][i][j]==9) break;
}
if(i-1>-1&&open[z].fangxiang!=2) {copy(x,z,1); tmp=c[x][i][j];c[x][i][j]=c[x][i-1][j];c[x][i-1][j]=tmp;copy(x,x,0);open[x].h=h(x);open[x].g=open[z].g+1;f[x]=open[x].h+open[x].g;open[x].parent=&open[z];open[x].fangxiang=1;cmp();x++;}
if(i+1<3&&open[z].fangxiang!=1) {copy(x,z,1); tmp=c[x][i][j];c[x][i][j]=c[x][i+1][j];c[x][i+1][j]=tmp;copy(x,x,0);open[x].h=h(x);open[x].g=open[z].g+1;f[x]=open[x].h+open[x].g;open[x].parent=&open[z];open[x].fangxiang=2;cmp();x++;}
if(j-1>-1&&open[z].fangxiang!=4) {copy(x,z,1); tmp=c[x][i][j];c[x][i][j]=c[x][i][j-1];c[x][i][j-1]=tmp;copy(x,x,0);open[x].h=h(x);open[x].g=open[z].g+1;f[x]=open[x].h+open[x].g;open[x].parent=&open[z];open[x].fangxiang=3;cmp();x++;}
if(j+1<3&&open[z].fangxiang!=3) {copy(x,z,1); tmp=c[x][i][j];c[x][i][j]=c[x][i][j+1];c[x][i][j+1]=tmp;copy(x,x,0);open[x].h=h(x);open[x].g=open[z].g+1;f[x]=open[x].h+open[x].g;open[x].parent=&open[z];open[x].fangxiang=4;cmp();x++;}
for(i=0,z=0;i<x;i++)
{
if(f[i]<f[z]) z=i;
}
f[z]=9999;
}
}
//上面就是A*算法求8数码的内容,后面省略一大段无关的窗体设计的语句
//最后面我要弄个按钮的事件。点击按钮运行shuchu()
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
shuchu();
}
};}
结果我发现前面的z,x,open等的声明似乎都没有运行哦
--------------------编程问答--------------------
看了这一段。。。 --------------------编程问答-------------------- 我知道我代码写的很noob.大家帮我改下阿 --------------------编程问答-------------------- C的程序,搬到C#来的,而且必要的代码缩进都没有,LZ干什么的,懒不要紧,但是也不能懒到这么垃圾的代码搬上来,还要别人帮你调整代码缩进吧。
问技术问题来论坛,找苦力来论坛好像不太好吧。 --------------------编程问答-------------------- LZ不要急,把代码整理下再问,会好很多,就是会的人一看你的代码,也没心情帮你了……
不过还是帮你顶下吧,俺C太垃圾了-_-! --------------------编程问答-------------------- 真的很难帮你,习惯很重要。
意图不知道,没注释,真的很难找错。
习惯不好,维护比开发更难弄。
--------------------编程问答-------------------- 没法看,那么多又乱 --------------------编程问答-------------------- 真看不下去啊 --------------------编程问答-------------------- 给我的第1感觉是看不懂~~
补充:.NET技术 , C#