请教代码问题。
这道题我的代码直接爆零,不理解为什么。看完题解后觉得除了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;
}
now 没有给初值。(你这个写法,now 其实没啥必要,直接累加 ans 就好了。你这个是个遍历,遍历一条加一条)
((i-x)*(i-x)+(j-y)*(j-y)==2)
,这个关系是斜对角线。斜对角线没有被控制就向右向下走一格是不对的。对 hi+2, hi-2, hj+2, hj-2 , x, y 是否走到棋盘外没有控制。