请教:洛谷P1002过河卒代码问题?

新手上路,请多包涵

请教代码问题。

这道题我的代码直接爆零,不理解为什么。看完题解后觉得除了dp的部分,其他的知识点都用到了,而且思路完整。下面献上本人拙劣的代码,请老师指教。

#include <bits/stdc++.h>
using namespace std;
int flag[25][25];//horse control
int n,m;//B location
int hi,hj;//horse location
int ans=0,now;
void dfs(int x,int y){
    if(now<ans) return;
    if(x==n&&y==m){
        now++;
        ans=max(ans,now);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!(flag[i][j]=1)&&((i-x)*(i-x)+(j-y)*(j-y)==2)){
                dfs(x+1,y);
                dfs(x,y+1);
                return;    
            }
        }
    }
}
int main(){
    cin>>n>>m>>hi>>hj;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            flag[i][j]=0;//flag
            flag[hi-1][hj+2]=1;
            flag[hi-1][hj-2]=1;
            flag[hi-2][hj+1]=1;
            flag[hi-2][hj-1]=1;
            flag[hi+1][hj+2]=1;
            flag[hi+1][hj-2]=1;
            flag[hi+2][hj+1]=1;
            flag[hi+2][hj-1]=1;
        }
    }
    dfs(0,0);
    cout<<ans<<endl;
    return 0;
}

讲讲我的思路:这道题从代码中您能读到其中主要有三个要点,分别是标记马控区,卒不能斜走,搜索路径总数。


下面是同学的一份代码,打了60分。也没用dp,没考虑标记马控区和卒的走法,而且他的搜索算法简单到让我怀疑。感觉很emo~您能对比这两份代码讲讲我到底哪里出了大问题吗?
我的代码经常爆零。

#include<iostream>
using namespace std;
int ans=0;
int n1,m1,n,m;
void dfs(int x,int y){
    if(x>n||y>m||x<0||y<0||x==n1||y==m1)return;
    if(x==n&&y==m){
        ans++;
        return;
    }
    dfs(x+1,y);
    dfs(x,y+1);
}
int main(){
    cin>>n>>m>>n1>>m1;
    dfs(0,0);
    cout<<ans;
}

过河卒

阅读 928
avatarAI BotBETA

首先,对于你的第一个问题,你的代码的问题主要在于对于马控区和卒的走法的处理方式。

在洛谷的P1002这道题中,马控区是一个很重要的概念,马控区是指在这个区域内的所有格子都被马控制,不能走卒。在原题中,马控区的大小和位置是固定的,这个区域是一个8x8的区域,位于河的左边,而卒只能向右或向下移动。

在你的代码中,你对马控区的处理方式是不正确的。你只是简单地标记了马控区,但是在搜索路径的时候,你没有检查是否走到了马控区,也没有检查卒是否走到了不能走的位置。这导致了你的代码无法正确地处理马控区和卒的走法。

此外,你的代码中还存在一些逻辑错误。例如,你在搜索路径的时候,没有正确地处理回溯的情况。当一条路径不符合条件时,你应该返回上一层搜索,而不是继续向下搜索。

对于第二个问题,对方的代码也存在一些问题。首先,他的代码中没有考虑马控区和卒的走法,这导致了他的代码无法正确地处理这道题。其次,他的代码中没有使用任何优化技巧,这使得他的代码效率低下,无法在规定的时间内得出正确答案。

总的来说,你的代码和对方的代码都存在一些问题。如果你想提高你的编程水平,你需要多思考、多练习,并且多阅读一些优秀的代码和算法书籍。这样可以帮助你更好地理解编程思想和技巧,并且提高你的编程能力。

1 个回答

now 没有给初值。(你这个写法,now 其实没啥必要,直接累加 ans 就好了。你这个是个遍历,遍历一条加一条)

((i-x)*(i-x)+(j-y)*(j-y)==2) ,这个关系是斜对角线。斜对角线没有被控制就向右向下走一格是不对的。

对 hi+2, hi-2, hj+2, hj-2 , x, y 是否走到棋盘外没有控制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题