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

📄 main.cpp

📁 人工智能
💻 CPP
字号:
#include <iostream>
#include <vector>
#include <queue>
#include <list>

using namespace std;

enum {UP,RIGHT,DOWN,LEFT};

struct Node{
	char board[3][3];
	int x,y;	//空格坐标
	int parent; //父节点下标
};

Node start;		//起始状态
Node target;	//目标状态

void init()
{
	start.board[0][0]='2';start.board[0][1]='8';start.board[0][2]='3';
	start.board[1][0]='1';start.board[1][1]='6';start.board[1][2]='4';
	start.board[2][0]='7';start.board[2][1]='0';start.board[2][2]='5';
	start.x=2;start.y=1;  //修改矩阵时空格坐标也要修改
	start.parent=-1;
	
	target.board[0][0]='1';target.board[0][1]='2';target.board[0][2]='3';
	target.board[1][0]='8';target.board[1][1]='0';target.board[1][2]='4';
	target.board[2][0]='7';target.board[2][1]='6';target.board[2][2]='5';
	target.x=1;target.y=1;
	target.parent=-1;
}

bool equal(const Node& node1,const Node& node2)	//判断两局面是否相等
{
	for(int i=0;i<3;++i)
		for(int j=0;j<3;++j)
			if(node1.board[i][j]!=node2.board[i][j]) return false;
		return true;
}
void display(const Node& node)  //输出局面
{
	for(int i=0;i<3;++i)
	{
		for(int j=0;j<3;++j)
			cout<<node.board[i][j]<<"	  ";
		cout<<endl;
	}
}

Node Move(Node node,int dir)  //将当前状态移动生成新状态返回。 dir 取值为: UP,RIGHT,DOWN,LEFT,表示将空格上,右,下,左移动
{
	int x=node.x;
	int y=node.y;
	
	if(dir==UP)
	{
		if(x<=0)
		{
			node.x=-1; //返回错误值,不能移动
			return node;
		}
		else
		{
			char t=node.board[x][y];
			node.board[x][y]=node.board[x-1][y];
			node.board[x-1][y]=t;
			node.x=x-1;
			return node;
		}
	}
	else if(dir==RIGHT)
	{
		if(y>=2)
		{
			node.x=-1; //返回错误值,不能移动
			return node;
		}
		else
		{
			char t=node.board[x][y];
			node.board[x][y]=node.board[x][y+1];
			node.board[x][y+1]=t;
			node.y=y+1;
			return node;
		}
	}
	else if(dir==DOWN)
	{
		if(x>=2)
		{
			node.x=-1; //返回错误值,不能移动
			return node;
		}
		else
		{
			char t=node.board[x][y];
			node.board[x][y]=node.board[x+1][y];
			node.board[x+1][y]=t;
			node.x=x+1;
			return node;
		}
	}
	else if(dir==LEFT)
	{
		if(y<=0)
		{
			node.x=-1; //返回错误值,不能移动
			return node;
		}
		else
		{
			char t=node.board[x][y];
			node.board[x][y]=node.board[x][y-1];
			node.board[x][y-1]=t;
			node.y=y-1;
			return node;
		}
		
	}
	else {node.x=-1;return node;}
	
}

bool exist(const list<Node>& open,const vector<Node>& closed,const Node& node) //在open,closed表中查询是否已经存在node状态
{
	for(list<Node>::const_iterator it=open.begin();
		it!=open.end();++it)
	{	
		if(equal((*it),node)) return 1;		
	}
	for(vector<Node>::const_iterator it=closed.begin();it!=closed.end();++it)
	{
		if(equal((*it),node)) return 1;			
	}
	return 0;
}

void BFS(const Node& start,const Node& target)
{
	cout<<"起始状态:"<<endl;
	display(start);
	cout<<endl;
	cout<<"目标状态:"<<endl;
	display(target);
	cout<<endl;

	list<Node> open;
	vector<Node> closed;
	vector<int> result;

	open.push_back(start);
	
	while(!open.empty())
	{
		Node out=open.front();
		open.pop_front();
		if(equal(out,target)) 
		{
			int i=out.parent;
			while(i!=-1)
			{
				result.push_back(i);
				i=closed[i].parent;
			}
			break;
		}
		closed.push_back(out);
		Node outUp=Move(out,UP);
		if(outUp.x!=-1)
		{
			if(!exist(open,closed,outUp))
			{
				outUp.parent=closed.size()-1;
				open.push_back(outUp);
			}
		}
		Node outRight=Move(out,RIGHT);
		if(outRight.x!=-1)
		{
			if(!exist(open,closed,outRight))
			{
				outRight.parent=closed.size()-1;
				open.push_back(outRight);
			}
		}
		Node outDown=Move(out,DOWN);
		if(outRight.x!=-1)
		{
			if(!exist(open,closed,outDown))
			{
				outDown.parent=closed.size()-1;
				open.push_back(outDown);
			}
		}
		Node outLeft=Move(out,LEFT);
		if(outLeft.x!=-1)
		{
			if(!exist(open,closed,outLeft))
			{
				outLeft.parent=closed.size()-1;
				open.push_back(outLeft);
			}
		}

	}
	cout<<"宽度优先搜索:"<<endl;
	for(int i=result.size()-1;i>=0;--i)
	{
		display(closed[result[i]]);
		cout<<endl;
	}
	
	display(target);
	cout<<"宽度优先搜索结束!"<<endl<<endl;
}

void main()
{
	init();
	BFS(start,target);
}

⌨️ 快捷键说明

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