八数码问题的迭代加深算法
找出bug的有奖励
八数码问题是指一个3X3的9格棋盘上放置1到8这8个数字,多余一个空格,空格周围的数字可以移动到空格中
例如输入0,2,3,1,8,4,7,6,5这九个数(0表示空格位置),按输入顺序排列为setp 0,通过若干步移动就可以到达最终状态setp 2:
setp 0
0 2 3
1 8 4
7 6 5
setp 1
1 2 3
0 8 4
7 6 5
setp 2
1 2 3
8 0 4
7 6 5
下面是代码:
程序代码:#include
enum direction{start,up,down,left,right};
int matrix[3][3];
int print_matrix(int);
int all_in_place();
int iterative_deepening(int k,int d,int i,int j,enum direction dir);
int main()
{
const int MAX_DEPTH=10; //深度边界
int i,j,d;
for(i=0;i<9;i++) //输入0~9,0表示空格
scanf("%d",matrix[0]+i);
for(i=0; i<9&&matrix[0][i]; i++) //寻找空格位置
;
j = i%3;
i /= 3;
//迭代加深的DFS盲目搜索算法,深度边界从1到MAX_DEPTH
for(d=1;d
;
return 0;
}
/*
* k : 当前深度
* d : 深度边界
* i,j : 空格位置
* dir : 上一步移动方向
*/
int iterative_deepening(int k,int d,int i,int j,enum direction dir)
{
int ret=1;
if(k>d)
return ret;
if(all_in_place()) // 到达目标状态
return print_matrix(k);
else
{
if(dir!=up&&i<2 ) //可以向下
{
matrix[i][j] = matrix[i+1][j];
matrix[i+1][j] = 0;
ret = iterative_deepening(k+1,d,i+1,j,down);
matrix[i+1][j] = matrix[i][j];
matrix[i][j] = 0;
if(!ret)
return print_matrix(k);
}
if(dir!=down&&i>0 ) //可以向上
{
matrix[i][j] = matrix[i-1][j];
matrix[i-1][j] = 0;
ret = iterative_deepening(k+1,d,i-1,j,up);
matrix[i-1][j] = matrix[i][j];
matrix[i][j] = 0;
if(!ret)
return print_matrix(k);
}
if(dir!=left&&j<2 ) //可以向右
{
matrix[i][j] = matrix[i][j+1];
matrix[i][j+1] = 0;
ret = iterative_deepening(k+1,d,i,j+1,left);
matrix[i][j+1] = matrix[i][j];
matrix[i][j] = 0;
if(!ret)
return print_matrix(k);
}
if(dir!=right&&j>0 ) //可以向左
{
matrix[i][j] = matrix[i][j-1];
matrix[i][j-1] = 0;
ret = iterative_deepening(k+1,d,i,j-1,left);
matrix[i][j-1] = matrix[i][j];
matrix[i][j] = 0;
if(!ret)
return print_matrix(k);
}
}
return ret;
}
int all_in_place()
{
const int object[3][3]={{1,2,3},{8,0,4},{7,6,5}};
int i;
for(i=0;i<9;i++)
if(matrix[0][i] != object[0][i])
return 0;
return 1;
}
int print_matrix( int count)
{
int i,j;
printf("\n\nsetp %d\n",count);
for(i=0;i<3;i++,putchar('\n'))
for(j=0;j<3;j++)
printf("%d\t",matrix[i][j]);
return 0;
}