鱼C论坛

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

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

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

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

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

x
本帖最后由 学习编程中的Ben 于 2023-1-26 21:18 编辑

这题摘自洛谷,题目详情------>https://www.luogu.com.cn/problem/P1002

有些人可能建议会让我看题解,但谢谢了,我只是想知道我代码的错误

代码如下:

  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4. #include <cmath>

  5. using namespace std;

  6. int bx = 5, by = 5, hx, hy, z[10][2]{}, m = 1, we = 0;

  7. void DFS(int x, int y){
  8.    // 这行是为了调试
  9.     cout << x << "-----" << y << "-----" << bx << endl;

  10.     for (int i = 0; i < 9; i++){
  11.         if (x == z[i][0] && y == z[i][1]){
  12.             we += 0;
  13.         }
  14.     }
  15.     if (x == bx && y == by){
  16.         we += 1;
  17.     }
  18.     if (x < bx || y < by){
  19.         DFS(x + 1, y);
  20.         DFS(x, y + 1);
  21.     }
  22. }

  23. int main()
  24. {
  25.     cin >> bx >> by >> hx >> hy;
  26.     z[10][0] = hx;
  27.     z[10][1] = hy;
  28.     for (int i = -2; i <= 2; i++){
  29.         for (int j = -2; j <= 2; j++){
  30.             if (i == 0 || j == 0 || abs(j) == abs(i)){
  31.                 continue;
  32.             }
  33.             z[m][0] = hx + i;
  34.             z[m][1] = hy + j;
  35.             m += 1;
  36.         }
  37.     }
  38.     DFS(0, 0);
  39.     cout << we;
  40. }
复制代码


代码思路:


先求出所有马能吃到的点,即main函数中的循环
在通过递归,发现一条能走的路就将数量+1



问题:

上方我的注释中,打印了每次递归调用的值,
在我的DFS函数,递归的条件就是函数的参数(x与y)要小于B点的x和y
但经过运行,却发现x的值一直在增加,明显不符合判断


如图(我指的是x值)



                               
登录/注册后可看大图



@高山 @人造人


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






最佳答案
2023-1-26 21:41:37
dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪

这是我 5 个月前做这道题用的代码(写的有点丑,见谅):
  1. #include <iostream>
  2. using namespace std;
  3. long long ans,x1,y1,x2,y2;
  4. bool m[30][30];
  5. inline void setm(int x,int y)
  6. {
  7.         if (x>=0&&y>=0)m[x][y]=1;
  8. }
  9. inline void dfs(int x,int y)
  10. {
  11.         if (x==x1&&y==y1)
  12.         {
  13.                 ++ans;
  14.                 return;
  15.         }
  16.         //printf("%d %d %d %d\n",x,y,m[x+1][y],m[x][y+1]);
  17.         if (x+1<=x1&&m[x+1][y]==0)
  18.                 dfs(x+1,y);
  19.         if (y+1<=y1&&m[x][y+1]==0)
  20.                 dfs(x,y+1);
  21. }
  22. int main()
  23. {

  24.         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  25.         setm(x2,y2);
  26.         setm(x2+1,y2+2);setm(x2+2,y2+1);
  27.         setm(x2-1,y2-2);setm(x2-2,y2-1);
  28.         setm(x2-1,y2+2);setm(x2-2,y2+1);
  29.         setm(x2+2,y2-1);setm(x2+1,y2-2);
  30.         dfs(0,0);
  31.         printf("%lld",ans);
  32. }
复制代码

当 dfs 到某个坐标的时候,就分别 dfs x + 1,y 和 x, y + 1,如果新位置是马占领的地方就不 dfs 了

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-26 21:21:38 | 显示全部楼层
我康康
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-26 21:23:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-26 21:23:36 | 显示全部楼层
看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-26 21:33:21 | 显示全部楼层
地址应该发的出来啊
您直接把地址打出来应该就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-26 21:35:04 | 显示全部楼层
https://www.luogu.com.cn/problem/P1002
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-26 21:41:37 | 显示全部楼层    本楼为最佳答案   
dfs 会超,正解应该用递推,而且你的 dfs 我也觉得很奇怪

这是我 5 个月前做这道题用的代码(写的有点丑,见谅):
  1. #include <iostream>
  2. using namespace std;
  3. long long ans,x1,y1,x2,y2;
  4. bool m[30][30];
  5. inline void setm(int x,int y)
  6. {
  7.         if (x>=0&&y>=0)m[x][y]=1;
  8. }
  9. inline void dfs(int x,int y)
  10. {
  11.         if (x==x1&&y==y1)
  12.         {
  13.                 ++ans;
  14.                 return;
  15.         }
  16.         //printf("%d %d %d %d\n",x,y,m[x+1][y],m[x][y+1]);
  17.         if (x+1<=x1&&m[x+1][y]==0)
  18.                 dfs(x+1,y);
  19.         if (y+1<=y1&&m[x][y+1]==0)
  20.                 dfs(x,y+1);
  21. }
  22. int main()
  23. {

  24.         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  25.         setm(x2,y2);
  26.         setm(x2+1,y2+2);setm(x2+2,y2+1);
  27.         setm(x2-1,y2-2);setm(x2-2,y2-1);
  28.         setm(x2-1,y2+2);setm(x2-2,y2+1);
  29.         setm(x2+2,y2-1);setm(x2+1,y2-2);
  30.         dfs(0,0);
  31.         printf("%lld",ans);
  32. }
复制代码

当 dfs 到某个坐标的时候,就分别 dfs x + 1,y 和 x, y + 1,如果新位置是马占领的地方就不 dfs 了

你可以照这个代码改一下,或者改成记忆化搜索也行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

python显示:语法错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

这是C++题呀哥们
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我其实不会dfs
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 08:44:13 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

明白了:
  1. if (x == bx && y == by){
  2.     we += 1;
  3. }
复制代码

dfs 应该有边界条件,emm,感觉……

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

尝试在 we += 1 的后面加上 return,因为 x == bx, y == bx 就走不了了,退出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-27 08:48:19 | 显示全部楼层
你居然还会C++!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

对啊,我本来就会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我C++啥算法都不会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


一样
只会Python基础的渣渣
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我**
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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