洛谷 P2083 找人
题目背景
无
题目描述
小明要到他的同学家玩,可他只知道他住在某一单元,却不知住在哪个房间。那个单元有N层(1,2……N),每层有M(1,2……M)个房间。
小明会从第一层的某个房间开始找,他找的方式也很特别,每次到了一个房间,如果不是他的同学,他就会询问这人,
然后他就会去那人告诉他的房间号,如果还不是,他就会继续按这个方法找下去,直到找到。当然,他也有可能找不到同学。他的体力也是有限的,他每爬一层楼梯就会消耗V体力值。你的任务就是求找到同学耗费的最少体力值,如果找不到,就输出impossible 。
输入输出格式
输入格式:
共N+1行。
第一行,N,M,V,X,Y(X,Y表示同学只在X层Y房间)
2~N+1行,每行M*2个数字,第i+1行j*2-1个数Ak和j*2个数Ak+1表示住在i层j房间的人提供的信息是Ak层和Ak+1房间。(同学的信息就是自己的房间号)
输出格式:
一个数,即答案。
输入输出样例
说明
N<=1000,M<=100,V<=50
思路:搜索。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,v,x,y; int ans=0x7f7f7f7f; int vis[1010][101]; int map[1010][101][2]; void dfs(int i,int j,int sum){ if(i==x&&j==y){ ans=min(ans,sum); return ; } if(!vis[map[i][j][0]][map[i][j][1]]){ vis[map[i][j][0]][map[i][j][1]]=1; dfs(map[i][j][0],map[i][j][1],sum+abs(map[i][j][0]-i)); } } int main(){ scanf("%d%d%d%d%d",&n,&m,&v,&x,&y); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d%d",&map[i][j][0],&map[i][j][1]); for(int i=1;i<=m;i++){ vis[1][i]=1;dfs(1,i,0); memset(vis,0,sizeof(vis)); } if(ans==0x7f7f7f7f) cout<<"impossible"; else cout<<ans*v; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。