当前位置:编程学习 > C#/ASP.NET >>

呜呜...这段代码怎么改都改不正确.路过的好心人帮我看看.今晚弄不出来就挂了

其实是用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等的声明似乎都没有运行哦
--------------------编程问答--------------------
引用楼主 lyc6858 的帖子:
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++;} 


看了这一段。。。 --------------------编程问答-------------------- 我知道我代码写的很noob.大家帮我改下阿 --------------------编程问答-------------------- C的程序,搬到C#来的,而且必要的代码缩进都没有,LZ干什么的,懒不要紧,但是也不能懒到这么垃圾的代码搬上来,还要别人帮你调整代码缩进吧。
问技术问题来论坛,找苦力来论坛好像不太好吧。 --------------------编程问答-------------------- LZ不要急,把代码整理下再问,会好很多,就是会的人一看你的代码,也没心情帮你了……
不过还是帮你顶下吧,俺C太垃圾了-_-! --------------------编程问答-------------------- 真的很难帮你,习惯很重要。
意图不知道,没注释,真的很难找错。
习惯不好,维护比开发更难弄。
--------------------编程问答-------------------- 没法看,那么多又乱 --------------------编程问答-------------------- 真看不下去啊  --------------------编程问答-------------------- 给我的第1感觉是看不懂~~
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,