@[XingChen_MoNian](/user/920938)
```cpp
#include<iostream>
using namespace std;
int a[1005][105],b[1005][105],n,m,v,x,y,ans=2e9;
bool f=0;
int dfs(int idx,int idy,int anss,int s){
if(idx==x && idy==y){
f=1;
return anss;
}
if(s>n*m) return (int)2e9;
return dfs(a[idx][idy],b[idx][idy],anss+abs(a[idx][idy]-idx)*v,s+1);;
}
int main(){
cin>>n>>m>>v>>x>>y;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]>>b[i][j];
for(int i=1;i<=m;i++){
ans=min(ans,dfs(1,i,0,0));
}
if(!f) cout<<"impossible";
else cout<<ans;
return 0;
## }
```
by weak_in_code @ 2024-04-07 21:22:29
好像多打了两个#。
by weak_in_code @ 2024-04-07 21:22:58
@[weak_in_code](/user/753640)
不小心的,嘻嘻
by XingChen_MoNian @ 2024-04-07 21:25:19
wait@[XingChen_MoNian](/user/920938)
by weak_in_code @ 2024-04-07 21:28:58
我刚想了一下,因为这个递归函数没有什么分叉,从理论上来说是可以对的:
```cpp
#include<iostream>
#include<cmath>
using namespace std;
int a[1005][105],b[1005][105],n,m,v,x,y,ans=2e9,anss;
bool f=0;
int dfs(int idx,int idy,int s){
if(idx==x && idy==y){
f=1;
return anss;
}
if(s>n*m) return (int)2e9;
anss+=abs(a[idx][idy]-idx)*v;
return dfs(a[idx][idy],b[idx][idy],s+1);
}
int main(){
cin>>n>>m>>v>>x>>y;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]>>b[i][j];
for(int i=1;i<=m;i++){
anss=0;
ans=min(ans,dfs(1,i,0));
}
if(!f) cout<<"impossible";
else cout<<ans;
return 0;
}
```
by weak_in_code @ 2024-04-07 21:29:36
这份代码是对的,确实可以这么写。
by weak_in_code @ 2024-04-07 21:30:29
@[weak_in_code](/user/753640)
在我源代码上改了半天,发现根本原因好像是dfs的返回值
by XingChen_MoNian @ 2024-04-07 21:33:05
@[XingChen_MoNian](/user/920938) 正确的,应该是`return dfs(a[idx][idy],b[idx][idy],s+1)`
by weak_in_code @ 2024-04-07 21:33:50
@[XingChen_MoNian](/user/920938) 上面那份代码是写在外面的正确代码,没有分叉的dfs好像确实可以这么写
by weak_in_code @ 2024-04-07 21:35:13
谢谢大佬
膜拜,必须膜拜
by XingChen_MoNian @ 2024-04-07 21:35:14