|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 学习编程中的Ben 于 2023-1-26 21:18 编辑
这题摘自洛谷,题目详情------>https://www.luogu.com.cn/problem/P1002
有些人可能建议会让我看题解,但谢谢了,我只是想知道我代码的错误
代码如下:
- // Example program
- #include <iostream>
- #include <string>
- #include <cmath>
- using namespace std;
- int bx = 5, by = 5, hx, hy, z[10][2]{}, m = 1, we = 0;
- void DFS(int x, int y){
- // 这行是为了调试
- cout << x << "-----" << y << "-----" << bx << endl;
- for (int i = 0; i < 9; i++){
- if (x == z[i][0] && y == z[i][1]){
- we += 0;
- }
- }
- if (x == bx && y == by){
- we += 1;
- }
- if (x < bx || y < by){
- DFS(x + 1, y);
- DFS(x, y + 1);
- }
- }
- int main()
- {
- cin >> bx >> by >> hx >> hy;
- z[10][0] = hx;
- z[10][1] = hy;
- for (int i = -2; i <= 2; i++){
- for (int j = -2; j <= 2; j++){
- if (i == 0 || j == 0 || abs(j) == abs(i)){
- continue;
- }
- z[m][0] = hx + i;
- z[m][1] = hy + j;
- m += 1;
- }
- }
- DFS(0, 0);
- cout << we;
- }
复制代码
代码思路:
先求出所有马能吃到的点,即main函数中的循环
在通过递归,发现一条能走的路就将数量+1
问题:
上方我的注释中,打印了每次递归调用的值,
在我的DFS函数,递归的条件就是函数的参数(x与y)要小于B点的x和y
但经过运行,却发现x的值一直在增加,明显不符合判断
如图(我指的是x值)
@高山 @人造人
顺便在问一下各位,不知道为什么,我链接发不出来了,我点了那个带绿色加号的符号,也输入了要输入的,最后还是这样
dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪
这是我 5 个月前做这道题用的代码(写的有点丑,见谅):
- #include <iostream>
- using namespace std;
- long long ans,x1,y1,x2,y2;
- bool m[30][30];
- inline void setm(int x,int y)
- {
- if (x>=0&&y>=0)m[x][y]=1;
- }
- inline void dfs(int x,int y)
- {
- if (x==x1&&y==y1)
- {
- ++ans;
- return;
- }
- //printf("%d %d %d %d\n",x,y,m[x+1][y],m[x][y+1]);
- if (x+1<=x1&&m[x+1][y]==0)
- dfs(x+1,y);
- if (y+1<=y1&&m[x][y+1]==0)
- dfs(x,y+1);
- }
- int main()
- {
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- setm(x2,y2);
- setm(x2+1,y2+2);setm(x2+2,y2+1);
- setm(x2-1,y2-2);setm(x2-2,y2-1);
- setm(x2-1,y2+2);setm(x2-2,y2+1);
- setm(x2+2,y2-1);setm(x2+1,y2-2);
- dfs(0,0);
- printf("%lld",ans);
- }
复制代码
当 dfs 到某个坐标的时候,就分别 dfs x + 1,y 和 x, y + 1,如果新位置是马占领的地方就不 dfs 了
你可以照这个代码改一下,或者改成记忆化搜索也行
|
评分
-
查看全部评分
|