1 3 2 1 2 3
8 5 0 =>> 8 0 4
6 7 4 7 6 5
thanks!
Printable View
1 3 2 1 2 3
8 5 0 =>> 8 0 4
6 7 4 7 6 5
thanks!
I'm afraid you're going to have to be a lot more descriptive than that. What is it your are trying to do? With what? What have you done so far?
I have no Intelligence about C!
And we don't have psychic powers... We can't help if we don't know what you're trying to do.
I try my best to figure out !But I fail!
2 3 4
1 8 0
7 6 5
2 0 8
1 4 3
7 6 5
2 8 3
1 4 5
7 0 6
2 8 3
0 6 4
1 7 5
2 8 3
1 6 0
7 5 4
8 3 0
2 1 4
7 6 5
8 1 3
2 0 4
7 6 5
2 8 3
7 0 4
6 1 5
2 8 3
7 1 4
6 5 0
1 2 3
8 0 4
7 6 5
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#define Nil 0
#define LEN sizeof(struct Table)
struct Table
{
int change[3][3];
struct Table *next;
};
struct Table *HeadofOpen(Nil),*HeadofClose(Nil),*temp;
struct Table *AddtoOpen(int source[3][3],struct Table *Head);
struct Table *MovetoClose(struct Table *head1,struct Table *head2);
int ExtendOpen(struct Table *p);
int InTable(int matrix[3][3],struct Table *head);
int Same(int matrix1[3][3],int matrix2[3][3]);
void output(struct Table *head,FILE *pFile);
void swap(int &a,int &b);
static int target[3][3]={{1,2,3},{8,0,4},{7,6,5}}; //目标状态
int main()
{
int source[3][3];
int i,j,flag(0);
char c;
cout<<"请输入初始状态!"<<endl; //读取初始状态
temp=(struct Table *)malloc(LEN);
for(i=0;i<3;i++)
{
cout<<"请输入第"<<(i+1)<<"行,每输入一个数字后按空 格,输入三个数字后按回车结束:"<<endl;
for(j=0;j<3;j++)
cin>>source[i][j];
}
HeadofOpen=AddtoOpen(source,HeadofOpen); //初始状态进入OPEN表中
if(Same(source,target)) flag=1; //如果输入状态已是目标状态,则置flag为1
while((HeadofOpen!=Nil)&&(flag!=1))
{
HeadofClose=MovetoClose(HeadofOpen,HeadofClose); //将第1个结点从OPEN表移出并放入CLOSE表
flag=ExtendOpen(temp); //扩展n,把它的后继结点放入OPEN表的末端,提供回到n的 指针
}
if(HeadofOpen==Nil)
cout<<"该问题无法解决!"<<endl;
else
{
FILE *pFile;
/* Open for write */
if( (pFile = fopen( "output.txt", "w" )) == NULL )
{
printf( "The file 'output.txt' was not opened\n" );
return 0;
}
char s[100];
sprintf( s,"CLOSE表的内容:\n");
fwrite( s,strlen(s),1,pFile);
cout<<"CLOSE表的内容:"<<endl;
output(HeadofClose,pFile);
sprintf( s,"OPEN表的内容:\n");
fwrite( s,strlen(s),1,pFile);
cout<<"OPEN表的内容:"<<endl;
output(HeadofOpen,pFile);
fclose(pFile);
}
cout<<"Press any key to terminate!";
cin>>c;
return 0;
}
//************************************************** **************
struct Table *AddtoOpen(int matrix[3][3],struct Table *Head) //将结点放入OPEN表中
{
int i,j;
struct Table *p0,*p1,*p2;
p0=p1=p2=(struct Table *)malloc(LEN);
if(Head==Nil) //如果表是空的,则直接放入
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
(p1->change)[i][j]=matrix[i][j];
}
}
Head=p1;
(p1->next)=Nil;
}
else //如果表中已有内容,则插入到表的最后
{
p1=Head;
while((p1->next)!=Nil)
{
p2=p1;
p1=(p2->next);
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
(p0->change)[i][j]=matrix[i][j];
}
}
p1->next=p0;
p0->next=Nil;
};
return(Head); //将头指针返回
}
//************************************************** **********
//************************************************** **********
struct Table *MovetoClose(struct Table *head1,struct Table *head2) //从OPEN表移入到CLOSE表中
{
int i,j;
struct Table *p0,*p1,*p2;
void output(struct Table *head1);
p0=p1=p2=(struct Table *)malloc(LEN);
if(head2==Nil)
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
(p1->change)[i][j]=(head1->change)[i][j];
}
head2=p1;
p1->next=Nil;
}
else
{
p1=head2;
while((p1->next)!=Nil)
{
p2=p1;
p1=p2->next;
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
(p0->change)[i][j]=(head1->change)[i][j];
}
p1->next=p0;
p0->next=Nil;
};
temp=HeadofOpen;
HeadofOpen=temp->next;
return(head2);
}
//************************************************** ************
//************************************************** ************
int ExtendOpen(struct Table *p) //扩展OPEN表
{
int temp1[3][3],temp2[3][3],temp3[3][3],temp4[3][3];
int i,j,flag(0);
int row(0),line(0);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
temp1[i][j]=(p->change)[i][j];
temp2[i][j]=(p->change)[i][j];
temp3[i][j]=(p->change)[i][j];
temp4[i][j]=(p->change)[i][j];
if((p->change)[i][j]==0)
{
row=i;
line=j;
}
}
};
if((line>0)&&(!flag))
{
swap(temp1[row][line],temp1[row][line-1]);
if((!(InTable(temp1,HeadofOpen)))&&(!(InTable(temp 1,HeadofClose))))
HeadofOpen=AddtoOpen((temp1),HeadofOpen);
if(Same(temp1,target))
flag=1;
};
if((row>0)&&(!flag))
{
swap(temp2[row][line],temp2[row-1][line]);
if((!(InTable(temp2,HeadofOpen)))&&(!(InTable(temp 2,HeadofClose))))
HeadofOpen=AddtoOpen(temp2,HeadofOpen);
if(Same(temp2,target))
flag=1;
};
if((line<2)&&(!flag))
{ swap(temp3[row][line],(temp3)[row][line+1]);
if((!(InTable(temp3,HeadofOpen)))&&(!(InTable(temp 3,HeadofClose))))
HeadofOpen=AddtoOpen(temp3,HeadofOpen);
if(Same(temp3,target))
flag=1;
};
if((row<2)&&(!flag))
{ swap((temp4)[row][line],(temp4)[row+1][line]);
if((!(InTable(temp4,HeadofOpen)))&&(!(InTable(temp 4,HeadofClose))))
HeadofOpen=AddtoOpen(temp4,HeadofOpen);
if(Same(temp4,target))
flag=1;
};
return (flag);
}
//************************************************** ****
int InTable(int matrix[3][3],struct Table *head) //判断新产生的结点是否属于CLOSE或OPEN表
{
int i,j,flag1(0),flag2(0);
struct Table *p1,*p2;
p1=head;
while((p1!=Nil)&&(!flag2))
{
flag1=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(matrix[i][j]!=(p1->change)[i][j])
flag1=1;
}
if(flag1==0) flag2=1; //后移一个检查
p2=p1;
p1=p2->next;
}
return(flag2);
}
//************************************************** ****
int Same(int matrix1[3][3],int matrix2[3][3]) //判断是否相同的矩阵
{
int i,j,flag3(1);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(matrix1[i][j]!=matrix2[i][j])
flag3=0;
}
}
return(flag3);
}
//************************************************** *
void swap(int &a,int &b)
{
int t;
t=a;a=b;b=t;
}
//************************************************** *
void output(struct Table *head,FILE *pFile) //将表中内容依次输出
{
char s[100]="";
int i,j;
struct Table *p1,*p2;
p1=head;
while(p1!=Nil)
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
char stemp[100];
sprintf(stemp,"%d ",(p1->change)[i][j]);
strcat(s,stemp);
cout<<(p1->change)[i][j]<<" ";
}
strcat(s,"\n");
cout<<endl;
}
strcat(s,"\n");
cout<<endl;
fwrite(s,strlen(s),1,pFile);
sprintf(s,"");
p2=p1;
p1=p2->next;
}
}
Can you explain in just simple English what your program should do?
I'm sure that's not the only thing you have "no intelligence about"Quote:
Originally posted by xacoolboy
I have no Intelligence about C!
2 8 3
1 0 4
7 6 5
transform
1 2 3
8 0 4
7 6 5
by C programing!
extent searching or depth searching
thanks!!