推箱子(C++类实现)

直接上代码

#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

// 从文件中获取数据
void readFile(char** buffer, int* size, const char* filename)
{
   
	//ifstream in(filename, ios::binary);
	ifstream in(filename);
	if (!in)
	{
   
		// 失败
		*buffer = NULL;
		*size = 0;
	}
	else
	{
   
		in.seekg(0, ifstream::end);	// 设置文件指针到末尾
		*size = static_cast<int>(in.tellg());	// 读取文件长度
		in.seekg(0, ifstream::beg);	// 设置文件指针到开头
		*buffer = new char[*size];	// 申请内存
		in.read(*buffer, *size);	// 读取文件内容
	}
}

// 二维数组类,采用模板类方式
template<class T> class Array2D
{
   
public:
	Array2D() : m_pArray(NULL) {
   }
	~Array2D() 
	{
   
		if (m_pArray)
		{
   
			delete[] m_pArray;
			m_pArray = NULL;
		}
	}

public:
	void setSize(int sizex, int sizey)
	{
   
		m_nSizeX = sizex;
		m_nSizeY = sizey;
		m_pArray = new T[sizex * sizey];
	}

	T& operator()(int indexX,int indexY)
	{
   
		return m_pArray[indexY * m_nSizeX + indexX];
	}
	
	const T& operator()(int indexX, int indexY) const 
	{
   
		return m_pArray[indexY * m_nSizeX + indexX];
	}

private:
	T* m_pArray;
	int m_nSizeX;
	int m_nSizeY;	
};

// 状态类
class State 
{
   
public:
	
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 C++ 实现推箱子游戏的代码,其中用数字表示地图和物品: ``` #include <iostream> #include <vector> using namespace std; const int MAXN = 10; int n, m; int sx, sy; // 起点坐标 int ex, ey; // 终点坐标 int mp[MAXN][MAXN]; // 地图 int vis[MAXN][MAXN]; // 记录点是否访问过 vector<pair<int, int>> boxs; // 记录箱子位置 bool dfs(int x, int y) { if (x == ex && y == ey) return true; // 到达终点 if (mp[x][y] == 1 || vis[x][y]) return false; // 障碍或已访问过 vis[x][y] = 1; // 标记为已访问 for (int i = 0; i < boxs.size(); ++i) { int bx = boxs[i].first, by = boxs[i].second; if (bx == x && by == y) { // 当前位置有箱子 int nx = bx + (bx - x), ny = by + (by - y); if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // 超出边界 if (mp[nx][ny] == 1 || vis[nx][ny]) continue; // 障碍或已访问过 boxs[i].first = nx, boxs[i].second = ny; // 移动箱子 bool flag = dfs(x, y); // 从新位置开始搜索 boxs[i].first = bx, boxs[i].second = by; // 恢复箱子位置 if (flag) return true; // 可以到达终点 else continue; // 不可到达终点,继续搜索下一个箱子 } } if (x + 1 < n && !vis[x+1][y]) { // 向下搜索 if (dfs(x+1, y)) return true; } if (x - 1 >= 0 && !vis[x-1][y]) { // 向上搜索 if (dfs(x-1, y)) return true; } if (y + 1 < m && !vis[x][y+1]) { // 向右搜索 if (dfs(x, y+1)) return true; } if (y - 1 >= 0 && !vis[x][y-1]) { // 向左搜索 if (dfs(x, y-1)) return true; } return false; // 无法到达终点 } int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> mp[i][j]; if (mp[i][j] == 2) boxs.push_back(make_pair(i, j)); // 记录箱子位置 else if (mp[i][j] == 3) sx = i, sy = j; // 记录起点坐标 else if (mp[i][j] == 4) ex = i, ey = j; // 记录终点坐标 } } if (dfs(sx, sy)) cout << "Yes" << endl; else cout << "No" << endl; return 0; } ``` 该算法使用 DFS(深度优先搜索)实现,对于每个箱子位置,向四个方向搜索箱子可移动的位置,然后以新位置为起点继续搜索,直到找到终点或无法继续搜索为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值