鱼C论坛

 找回密码
 立即注册
查看: 2626|回复: 17

[已解决]关于题目——过河卒的问题

[复制链接]
发表于 2023-1-26 21:14:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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值)



                               
登录/注册后可看大图



@高山 @人造人


顺便在问一下各位,不知道为什么,我链接发不出来了,我点了那个带绿色加号的符号,也输入了要输入的,最后还是这样






最佳答案
2023-1-26 21:41:37
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 了

你可以照这个代码改一下,或者改成记忆化搜索也行

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
the_ben + 1 + 1 我帮不到你

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-26 21:21:38 | 显示全部楼层
我康康
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-26 21:23:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-26 21:23:36 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-26 21:33:21 | 显示全部楼层
地址应该发的出来啊
您直接把地址打出来应该就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-26 21:35:04 | 显示全部楼层
https://www.luogu.com.cn/problem/P1002
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-26 21:41:37 | 显示全部楼层    本楼为最佳答案   
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 了

你可以照这个代码改一下,或者改成记忆化搜索也行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-26 21:44:59 | 显示全部楼层
学习编程中的Ben 发表于 2023-1-26 21:35
https://www.luogu.com.cn/problem/P1002

python显示:语法错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-26 21:54:01 | 显示全部楼层
sfqxx 发表于 2023-1-26 21:44
python显示:语法错误

这是C++题呀哥们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-26 22:31:43 | 显示全部楼层
zhangjinxuan 发表于 2023-1-26 21:41
dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪

这是我 5 个月前做这道题用的代码(写的有点丑 ...

谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-27 08:43:28 | 显示全部楼层
zhangjinxuan 发表于 2023-1-26 21:41
dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪

这是我 5 个月前做这道题用的代码(写的有点丑 ...

我其实不会dfs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 08:44:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 08:46:31 | 显示全部楼层

明白了:
if (x == bx && y == by){
    we += 1;
}
dfs 应该有边界条件,emm,感觉……

额, dfs 不能一直 dfs,不能是一直递归,所以你这个就无限增加

尝试在 we += 1 的后面加上 return,因为 x == bx, y == bx 就走不了了,退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 08:48:19 | 显示全部楼层
你居然还会C++!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-27 09:44:26 | 显示全部楼层

对啊,我本来就会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 09:52:05 | 显示全部楼层

我C++啥算法都不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 10:06:28 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2023-1-27 10:08 编辑


一样
只会Python基础的渣渣
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 10:25:36 From FishC Mobile | 显示全部楼层
liuhongrun2022 发表于 2023-1-26 21:54
这是C++题呀哥们

我**
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 22:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表