⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eightdlg.cpp

📁 本程序是利用盲目搜索算法中的深度优先算法实现八数码问题的解决
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_bt7.SetWindowText(m8);		
	}
   if(strcmp(m9,"0")==0)
	{
		m_bt8.SetWindowText(m9);
		m_bt9.SetWindowText(m8);		
	}	
	}

void CEightDlg::OnButton9() 
{
	// TODO: Add your control notification handler code here
	
	m_bt6.GetWindowText(m6,2);
	m_bt8.GetWindowText(m8,2);
	m_bt9.GetWindowText(m9,2);
	if(strcmp(m6,"0")==0) { 
	    m_bt9.SetWindowText(m6);
		m_bt6.SetWindowText(m9);		
	}
   if(strcmp(m8,"0")==0)
	{
		m_bt9.SetWindowText(m8);
		m_bt8.SetWindowText(m9);		
	}	
}

void CEightDlg::OnButton10() 
{
	// TODO: Add your control notification handler code here
	
	m_bt1.GetWindowText(m1,2);
	m_bt2.GetWindowText(m2,2);
	m_bt3.GetWindowText(m3,2);
	m_bt4.GetWindowText(m4,2);
	m_bt5.GetWindowText(m5,2);
	m_bt6.GetWindowText(m6,2);
	m_bt7.GetWindowText(m7,2);
	m_bt8.GetWindowText(m8,2);
	m_bt9.GetWindowText(m9,2);
	a[0]=m1[0];
	a[1]=m2[0];
	a[2]=m3[0];
	a[3]=m4[0];
	a[4]=m5[0];
	a[5]=m6[0];
	a[6]=m7[0];
	a[7]=m8[0];
	a[8]=m9[0];

   //m_bt11.EnableWindow();	
}
int n,m;
typedef struct Node
{
char matrix[9];/*存储矩阵*/
char operate;/*存储不可以进行的操作,L代表不能左移,R代表不能右移,U代表

不能上移,D代表不能下移,N代表都能任何方向都能移*/
char extend;/*是否可以扩展,Y代表可以,N代表不可以*/
int  father;/*指向产生自身的父结点*/
}Node;
char start[9];/*初始矩阵*/
char end[9];/*目标矩阵*/
Node base[1000];/*存放过程中的矩阵*/
int result[100];/*存放结果的base数组下标号,逆序存放*/
int CEightDlg::match()/*判断是否为目标*/
{
	int i;
    for(i=0;i<9;i++)
	{
    if(base[n-1].matrix[i]!=end[i])
	{
     return 0;
	}
	}
    return 1;
}

void CEightDlg::GetPoint()
{
 	 streampos pos=ostream.tellp();
     ostream.seekp(pos);
}

CString CEightDlg::Value(int i)
{
	CString jj;
	if(i==1)    jj="第1步"; 
	if(i==2)    jj="第2步"; 
	if(i==3)    jj="第3步";  
	if(i==4)    jj="第4步"; 
	if(i==5)    jj="第5步"; 
	if(i==6)    jj="第6步"; 
	if(i==7)    jj="第7步"; 
	if(i==8)    jj="第8步"; 
	if(i==9)    jj="第9步"; 
	if(i==10)   jj="第10步"; 
	if(i==11)   jj="第11步"; 
	if(i==12)   jj="第12步"; 
	return jj;

}


void CEightDlg::show()/*显示矩阵的内容*/
{
   int i=1;
while(m>=0)
{
       CString jj;
	   int mm=result[m];
	   GetPoint();
       ostream<<"第"<<i<<"步"<<endl;
	   jj=Value(i);
   GetPoint();
   ostream<<"第"<<i<<"步"<<endl;
   ostream<<base[mm].matrix[0]<<"   "<<base[mm].matrix[1]<<"    "<<base[mm].matrix[2]<<endl;
   ostream<<base[mm].matrix[3]<<"   "<<base[mm].matrix[4]<<"    "<<base[mm].matrix[5]<<endl;
   ostream<<base[mm].matrix[6]<<"   "<<base[mm].matrix[7]<<"    "<<base[mm].matrix[8]<<endl;
  SetDlgItemText(IDC_STATIC,jj);
	   m1[0]=base[mm].matrix[0]; 
       m2[0]=base[mm].matrix[1]; 
       m3[0]=base[mm].matrix[2]; 
       m4[0]=base[mm].matrix[3]; 
	   m5[0]=base[mm].matrix[4]; 
	   m6[0]=base[mm].matrix[5]; 
	   m7[0]=base[mm].matrix[6]; 
	   m8[0]=base[mm].matrix[7]; 
	   m9[0]=base[mm].matrix[8];
	   m1[1]='\0';
	   m2[1]='\0';
	   m3[1]='\0';
	   m4[1]='\0';
	   m5[1]='\0';
	   m6[1]='\0';
	   m7[1]='\0';
	   m8[1]='\0';
	   m9[1]='\0';
	   m_bt1.SetWindowText(m1);
	   m_bt2.SetWindowText(m2);
	   m_bt3.SetWindowText(m3);
	   m_bt4.SetWindowText(m4);
	   m_bt5.SetWindowText(m5);
	   m_bt6.SetWindowText(m6);
	   m_bt7.SetWindowText(m7);
	   m_bt8.SetWindowText(m8);
	   m_bt9.SetWindowText(m9);
      for(int c=0;c<60000;c++)
		 for(int d=0;d<10000;d++){}
       m--;
       i++;
   }
    for(int c=0;c<200000;c++)
		 for(int d=0;d<10000;d++){}

}

void CEightDlg::leave()/*推理成功后退出程序之前要执行的函数,主要作用是输出结果*/
{
n--;
while(base[n].father!=-1)
{
  result[m]=n;
  m++;
  n=base[n].father;
}
result[m]=0;/*把所有的base数组下标号逆序存放在result数组中*/
result[m+1]='\0';
show();
}

void CEightDlg::left(int x)/*把下标为X的数组中的矩阵的空格左移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)/*找到空格所在位*/
{
  if(base[x].matrix[i]==' ')
   break;
}
if(i==0||i==3||i==6||i==9)/*不能向左移动的情况*/
{
  return ;
}

for(j=0;j<9;j++)
{
  base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i-1];
base[n].matrix[i-1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='R';/*设置为不能右移,否则又回到原来的矩阵*/
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';/*把父结点设置为不能扩展*/
n++;
if(match())
leave();
return ;
}


void CEightDlg::right(int x)/*把下标为X的数组中的矩阵的空格右移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
  if(base[x].matrix[i]==' ')
   break;
}
if(i==2||i==5||i==8||i==9)/*不能向右移动的情况*/
{
  return;
}

for(j=0;j<9;j++)
{
  base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i+1];
base[n].matrix[i+1]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='L';/*设置为不能左移,否则又回到原来的矩阵*/
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match())
leave();
return;
}

void CEightDlg::up(int x)/*把下标为X的数组中的矩阵的空格上移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
  if(base[x].matrix[i]==' ')
   break;
}
if(i==0||i==1||i==2||i==9)/*不能向上移动的情况*/
{
  return;
}

for(j=0;j<9;j++)
{
  base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i-3];
base[n].matrix[i-3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='D';/*设置为不能下移,否则又回到原来的矩阵*/
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match())  leave();
return;
}

void CEightDlg::down(int x)/*把下标为X的数组中的矩阵的空格下移*/
{
int i,j;
char ch;
for(i=0;i<9;i++)
{
  if(base[x].matrix[i]==' ')
   break;
}
if(i==6||i==7||i==8||i==9)/*不能向下移动的情况*/
{
  return;
}

for(j=0;j<9;j++)
{
  base[n].matrix[j]=base[x].matrix[j];
}
ch=base[n].matrix[i+3];
base[n].matrix[i+3]=base[n].matrix[i];
base[n].matrix[i]=ch;
base[n].operate='U';/*设置为不能上移,否则又回到原来的矩阵*/
base[n].extend='Y';
base[n].father=x;

base[x].extend='N';
n++;
if(match())  leave();
return;
}

void CEightDlg::OnButton11() 
{
	// TODO: Add your control notification handler code here
	
	int i;
    char s,l;
     n=1;

/*以下是输入初始和目标矩阵,并把输入的0转换为空格*/		
for(i=0;i<9;i++)
{
  if(a[i]=='0')
  {
   a[i]=' ';
     }
  if(b[i]=='0')
  {
   b[i]=' ';
  }
  start[i]=a[i];
  end[i]=b[i];
}
start[9]='\0';
end[9]='\0';

for(i=0;i<9;i++)
{
  base[0].matrix[i]=start[i];
}
base[0].operate='N';
base[0].extend='Y';
base[0].father=-1;
/*以上是为第一个base数组元素赋值*/

for(i=0;n<1000;i++)
{
  if(base[i].extend=='Y')
  {
   if(base[i].operate=='L')
   {
    right(i);
    up(i);
    down(i);
   }
   if(base[i].operate=='R')
   {
    left(i);
    up(i);
    down(i);
   }
   if(base[i].operate=='U')
   {
    left(i);
    right(i);
    down(i);
   }
   if(base[i].operate=='D')
   {
    left(i);
    right(i);
    up(i);
   }
   if(base[i].operate=='N')
   {
    left(i);
    right(i);
    up(i);
    down(i);
   }
  }
}
//printf("The number of circulation is exceed 4000!\n please input the number again!\n");
//getchar();
//goto input;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -