c++ 让高桥高兴 如果高桥经过的格子(包括起点和终点)中的数互不相同,高桥就会高兴。问有多少种可以让高桥高兴的路线?
时间: 2024-02-22 14:55:38 浏览: 22
这是一道经典的搜索问题,可以使用回溯算法进行求解。
具体的思路是:从起点开始,每次向上、下、左、右四个方向移动一步,判断移动后的格子是否合法(即未越界且格子中的数不重复),如果合法则继续向下搜索,否则回溯到上一个格子继续搜索。
代码如下:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 5;
int g[N][N];
bool st[N][N]; // 标记格子是否访问过
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 四个方向
int dfs(int x, int y)
{
if (x == N - 1 && y == N - 1) return 1; // 到达终点,方案数+1
int res = 0;
st[x][y] = true; // 标记当前格子已访问
for (int i = 0; i < 4; i++) // 枚举四个方向
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < N && b >= 0 && b < N && !st[a][b] && !g[a][b]) // 判断移动后的格子是否合法
{
res += dfs(a, b); // 继续搜索
}
}
st[x][y] = false; // 回溯
return res;
}
int main()
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> g[i][j];
cout << dfs(0, 0) << endl;
return 0;
}
```
其中,g数组表示每个格子中的数,st数组表示格子的访问状态。在dfs函数中,首先判断是否到达终点,如果是则方案数+1;否则枚举四个方向,判断移动后的格子是否合法,如果合法则继续搜索。最后回溯到上一个格子。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)