用C語言實現八數碼問題
#include<stdio.h>
#include<conio.h>
int n,m;
typedef struct Node
{
char matrix[10];/*儲存矩陣*/
char operate;/*儲存不可以進行的操作,L代表不能左移R代表不能右移U代表不能上移D代表不能下移*/
char extend;/*是否可以擴充套件,Y代表可以,N代表不可以*/
int father;/*指向產生自身的父結點*/
}Node;
char start[10]={"83426517 "};/*此處沒有必要初始化*/
char end[10]={"1238 4765"};/*此處沒有必要初始化*/
Node base[4000];
int result[100];/*存放結果的base陣列下標號,逆序存放*/
int match()/*判斷是否為目標*/
{
int i;
for(i=0;i<9;i++)
{
if(base[n-1].matrix[i]!=end[i])
{
return 0;
}
}
return 1;
}
void show()/*顯示矩陣的內容*/
{
int i=1;
while(m>=0)
{
int mm=result[m];
clrscr();
printf("/n/n/n http://www.zhensoft.com ZHEN SHI LEI/t/tStep %d",i);
printf("/n/n/n/n/n/t/t/t%c/t%c/t%c/n",base[mm].matrix[0],base[mm].matrix[1],base[mm].matrix[2]);
printf("/n/n/t/t/t%c/t%c/t%c/n",base[mm].matrix[3],base[mm].matrix[4],base[mm].matrix[5]);
printf("/n/n/t/t/t%c/t%c/t%c/n",base[mm].matrix[6],base[mm].matrix[7],base[mm].matrix[8]);
sleep(1);
m--;
i++;
}
}
void leave()/*推理成功後退出程式之前要執行的函式,主要作用是輸出結果*/
{
n--;
while(base[n].father!=-1)
{
result[m]=n;
m++;
n=base[n].father;
}
result[m]=0;
result[m+1]='/0';
show();
clrscr();
printf("/n/n/n/n/n/n/n/n/n/t/t/t/tThe End/n/n/n/n/n/n/n/n/n/n");
getch();
exit(0);
}
int 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 0;
}
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(i))
leave();
return 1;
}
int 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 0;
}
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(i))
leave();
return 1;
}
int 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 0;
}
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(i))
leave();
return 1;
}
int 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 0;
}
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(i))
leave();
return 1;
}
main()
{
int i;
char a[20],b[20];
n=1;
textcolor(LIGHTGREEN);
clrscr();
/*以下是輸入初始和目標矩陣,並把輸入的0轉換為空格*/
printf("Please input the start 9 chars:");
scanf("%s",a);
printf("Please input the end 9 chars:");
scanf("%s",b);
for(i=0;i<9;i++)
{
if(a[i]=='0')
{
start[i]=' ';
continue;
}
if(b[i]=='0')
{
end[i]=' ';
continue;
}
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<4000;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);
}
}
}
}
相關文章
- c語言實現貓吃老鼠的問題C語言
- RTree原始碼——C語言實現原始碼C語言
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 用C語言解決迷宮問題C語言
- 八數碼 經典問題
- 主元素問題(C語言)C語言
- C語言怎麼實現可變引數C語言
- C語言預設引數值的實現C語言
- 力扣896. 單調數列-C語言實現-簡單題力扣C語言
- C語言解決排序問題C語言排序
- C語言緩衝區問題C語言
- c語言金字塔問題C語言
- C 語言常見問題(轉)
- 複數的四則運算(C語言實現)C語言
- ORACLE 數字演算法的C語言實現Oracle演算法C語言
- c語言實用小程式C語言
- 掃雷--C語言實現C語言
- C語言實現DES加密C語言加密
- c語言實現階乘C語言
- c語言的一結構資料的堆疊實現問題薦C語言
- C語言50題之模擬實現atof、atoiC語言
- 人工智慧之八數碼問題人工智慧
- 八皇后問題分析和實現
- C語言常見使用問題2C語言
- C語言指標常見問題C語言指標
- (C語言版)猴子吃桃問題C語言
- 關於C語言的面試問題C語言面試
- C語言陣列實現約瑟夫環出圈問題 程式碼詳細註釋 簡單易懂C語言陣列
- C 語言隨機數生成器的實現分析隨機
- PAT Basic 1057. 數零壹(20)(C語言實現)C語言
- C語言基礎例項—3句解決數字出現頻率問題C語言
- 用C語言實現常見的三種中文內碼轉換(轉)C語言
- C語言實現TCP通訊C語言TCP
- 高精度加法(C語言實現)C語言
- c語言實現this指標效果C語言指標
- C語言實現順序表C語言
- C語言實現連結串列C語言
- 漢諾塔(hanoi) C語言實現C語言