9862求助

题目描述:

最近探险家们在X国发现了一处遗迹,里面的地形复杂好比一个迷宫,但是里面有非常多的宝藏。

探险家们提前用“鹰眼”探查到了这个迷宫的地图结构,可以用一个二维图来表示。'#‘代表无法跨越的陷阱,’*'代表可以去的位置,某些位置上存在宝藏,用一个数字表示这个宝藏的价值。遗迹特别神奇,某个位置一旦经过就会消失,不可再次到达。在迷宫中移动有上下左右四种方式。

探险家们想要知道从左上角的入口到达右下角的出口,最多可以获得多少宝藏?

输入格式:

第一行包含两个整数n,m,表示迷宫的大小。

接下来的n行,每行包含m个字符,代表迷宫(保证入口没有陷阱)。

输出格式:

一个整数。代表总共可获得的宝藏价值和,无法到达出口则输出-1

样例输入1:

5 6 
1****# 
*###2# 
4###*# 
*###1# 
**1***

样例输出1:

6

约定:

1 <= N,M<= 7,0<=宝藏价值<=9


1. #include<bits/stdc++.h>
2. using namespace std;
3. int n,m;
4. char ch;
5. int mark[10][10];
6. bool vis[10][10];
7. int dx[4]={-1,1,0,0};
8. int dy[4]={0,0,-1,1};
9. int ans=0;
10. void dfs(int x,int y){
11. 	if(x==n&&y==m){
12. 		return;
13. 	}
14. 	if(x<1||x>n||y<1||y>m) return;
15. 	for(int i=0;i<4;i++){
16. 		if(mark[x+dx[i]][y+dy[i]]==-1) continue;
17. 		if(vis[x+dx[i]][y+dy[i]]) continue;
18. 		vis[x+dx[i]][y+dy[i]]=true;
19. 		ans+=mark[x+dx[i]][y+dy[i]];
20. 		dfs(x+dx[i],y+dy[i]);
21. 		vis[x+dx[i]][y+dy[i]]=false;
22. 	}
23. }
24. int main(){
25. 	cin>>n>>m;
26. 	for(int i=1;i<=n;i++){
27. 		for(int j=1;j<=m;j++){
28. 			cin>>ch;
29. 			if(ch=='#') mark[i][j]==-1;
30. 			if(ch=='*') mark[i][j]==0;
31. 			if(ch>='1'&&ch<='9') mark[i][j]==ch-'0';
32. 		}
33. 	}
34. 	ans=mark[1][1];
35. 	dfs(1,1);
36. 	cout<<ans;
37. 	return 0;
38. }
7 个赞

发个题面呗

6 个赞

问题1:29~31行的等于运算符和赋值再检查一下;
问题2:14行的判断越界判早了吧,万一16行之后的代码加了dx[i]越界咋办,所以建议判越界放在17行那里;
问题3:20行之后的回溯,标记清0了很好,是不是也要把ans回溯一下;
问题4:求最多获得的宝藏,肯定是多种情况比较出来的,所以11行那里一种情况结束,应该还要找最大的ans

9 个赞

无法无天的回骨灰级老帖,之前回老帖都没说你,现在又编辑老帖,警告一次

1 个赞