题意:求A到B所需要的能量,顺着水流走不需要能量,否则每走一步需要需要1个单位能量.
分析:BFS+优先队列..
太弱了,感觉这题放在比赛估计会写不出来,囧啊,,搜索都快不会了...
// File Name: 11573.cpp // Author: Zlbing // Created Time: 2013/3/28 18:38:50 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define LL long long #define REP(i,r,n) for(int i=r;i<=n;i++) #define RREP(i,n,r) for(int i=n;i>=r;i--) #define MAXN 1005 int G[MAXN][MAXN]; bool vis[MAXN][MAXN]; int d[MAXN][MAXN]; int n,m; struct node{ int x,y,len; bool operator <(const node &a)const{ return len>a.len; } }; node change(node t,int k) { if(G[t.x][t.y]==k) t.len--; if(k==0) t.x--; if(k==1) t.x--,t.y++; if(k==2) t.y++; if(k==3) t.y++,t.x++; if(k==4) t.x++; if(k==5) t.x++,t.y--; if(k==6) t.y--; if(k==7) t.y--,t.x--; t.len++; return t; } int bfs(node st,node ed) { priority_queue<node> Q; while(!Q.empty())Q.pop(); CL(vis,0); CL(d,-1); Q.push(st); d[st.x][st.y]=0; while(!Q.empty()) { node t=Q.top(); Q.pop(); if(t.x==ed.x&&t.y==ed.y)return t.len; for(int i=0;i<8;i++) { node tmp=change(t,i); if(tmp.x<1||tmp.x>n||tmp.y<1||tmp.y>m) continue; if(d[tmp.x][tmp.y]!=-1&&tmp.len>=d[tmp.x][tmp.y]) continue; d[tmp.x][tmp.y]=tmp.len; Q.push(tmp); } } return -1; } int main() { while(~scanf("%d%d",&n,&m)) { REP(i,1,n) REP(j,1,m) scanf("%1d",&G[i][j]); int N; scanf("%d",&N); node st,ed; while(N--) { scanf("%d%d",&st.x,&st.y); scanf("%d%d",&ed.x,&ed.y); st.len=0; int ans=bfs(st,ed); printf("%d\n",ans); } } return 0; }