2 条题解
-
2njnu21160130 LV 8 @ 2018-12-03 12:00:29
写在开头:非官方题解,加上比较菜,说错的地方还望指正。
1.理思路:去 是最短路径,最短路径肯定也是简单路径,不然进了死胡同再出来浪费步数啊。回来题目也说了是简单路径,并且从左上到右下,和从右下到左上其实一个意思。 所以该题本质是在求 “从左上到右下的所有简单路径中,最短的那条,和路上项链最多的那条”。
2.选做法:求两点的简单路径,我个人选的DFS,不过BFS好像也没毛病,至于BFS+DFS跑两遍的做法我觉得跑多了。
3.测试点注意:a.左上角即出发位置的脚下有项链。
4.参考源码(不知道该不该有,自己的写法可能不正统)
#include <cstdio> #include <iostream> #include <cstring> using namespace std; char c[105][105]; int n,m; int p,xi; int jp,jx; int xy[4][2]={1,0,0,1,-1,0,0,-1}; void DFS(int x,int y,int xi,int p) { if(x==n&&y==m) { if(p<jp) jp=p; if(xi>jx) jx=xi; return; } for(int i=0;i<4;i++) { int xx=x+xy[i][0],yy=y+xy[i][1]; if(c[xx][yy]=='0'||c[xx][yy]=='#') { bool f=false; if(c[xx][yy]=='#') { xi++; f=true; } p++; c[xx][yy]='1'; DFS(xx,yy,xi,p); xi=f?xi-1:xi; c[xx][yy]=f?'#':'0'; p--; } } } int main() { jp=99999; jx=0; memset(c,'1',sizeof(c)); scanf("%d%d",&n,&m); getchar(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) c[i][j]=getchar(); getchar(); } bool f=false; if(c[1][1]=='#') f=true; c[1][1]='1'; if(f) DFS(1,1,1,0); else DFS(1,1,0,0); cout<<jp<<' '<<jx<<endl; return 0; }
-
-12018-12-07 16:42:36@
/* */ #define method_1 #ifdef method_1 /* */ #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<set> #include<map> #include<queue> #include<stack> #include<vector> #include<cstring> #include<cstdlib> using namespace std; typedef long long ll; const int maxn=100+5; const int INF=0x3f3f3f3f; const int dx[]={0,1,0,-1}; const int dy[]={1,0,-1,0}; int n,m; char G[maxn][maxn]; int vis[maxn][maxn]; int ans1=INF; int ans2=0; bool check(int x,int y) { if(x<=0||x>=(n+1)||y<=0||y>=(m+1)||(G[x][y]=='1')) return false; return true; } void dfs(int x,int y,int len){ if(x==n&&y==m){ ans1=min(ans1,len); return; } if(len>=ans1) return; for(int i=0;i<=3;i++){ int newx=x+dx[i]; int newy=y+dy[i]; if(check(newx,newy)&&!vis[newx][newy]){ vis[newx][newy]=1; dfs(newx,newy,len+1); vis[newx][newy]=0; } } } void rdfs(int x,int y,int len){ if(G[x][y]=='#'){ len++; //cout<<x<<" "<<y<<endl; } if(x==1&&y==1){ ans2=max(len,ans2); return; } for(int i=0;i<=3;i++){ int newx=x+dx[i]; int newy=y+dy[i]; if(check(newx,newy)&&vis[newx][newy]==0){ vis[newx][newy]++; //if(G[newx][newy]=='#') rdfs(newx,newy,len+1); //else rdfs(newx,newy,len); vis[newx][newy]--; } } } int main() { ios::sync_with_stdio(false); freopen("营救公主.in","r",stdin); memset(vis,0,sizeof(vis)); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>G[i][j]; } } vis[1][1]=1; dfs(1,1,0); cout<<ans1<<" "; memset(vis,0,sizeof(vis)); vis[n][m]=1; rdfs(n,m,0); /* cout<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cout<<G[i][j]; } cout<<endl; } */ cout<<ans2; return 0; } #endif #ifdef method_2 /* */ #endif #ifdef method_3 /* */ #endif
- 1
信息
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 225
- 已通过
- 43
- 通过率
- 19%
- 被复制
- 8
- 上传者