Codeup广度优先搜索(BFS):【宽搜入门】8数码难题

题目描述

 

初始状态的步数就算1,哈哈

输入:第一个3*3的矩阵是原始状态,第二个3*3的矩阵是目标状态。 
输出:移动所用最少的步数 

Input

2 8 3 
1 6 4 
7 0 5 
1 2 3 
8 0 4 
7 6 5 

Output

6


#include
using namespace std;
struct Node{
	int x,y;
	int step;
	int m[3][3];
	int last[2]; 
}node;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int original[3][3],final[3][3];
bool check(int x,int y){
	if(x>=3||x<0||y>=3||y<0) return false;
	return true;
}
bool same(int a[3][3]){
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			if(a[i][j]!=final[i][j])
			return false;
		}
	}
	return true;
}
int BFS(int x,int y){
	queue q;
	node.x=x,node.y=y,node.step=1;
	node.last[0]=x,node.last[1]=y;
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			node.m[i][j]=original[i][j];
		}
	}
	q.push(node);
	while(!q.empty()){
		Node top=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int newx=top.x+dx[i];
			int newy=top.y+dy[i];
			if(check(newx,newy) && (newx!=top.last[0]||newy!=top.last[1])){
				node.x=newx,node.y=newy;
				node.step=top.step+1;
				node.last[0]=top.x;
				node.last[1]=top.y;
				for(int i=0;i<3;i++){
					for(int j=0;j<3;j++){
						node.m[i][j]=top.m[i][j];
					}
				}
				int tmp=node.m[newx][newy];
				node.m[top.x][top.y]=tmp;
				node.m[newx][newy]=0;
				if(same(node.m)) return node.step;
				q.push(node);
			}
		}
	}
	return -1;
}
int main(){
	int x,y,ans;
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cin>>original[i][j];
			if(original[i][j]==0){
				x=i;y=j;
			}
		}
	}
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cin>>final[i][j];
		}
	}
	cout<

 

你可能感兴趣的:(ACM)