标签:blog io ar for sp on 2014 log amp
n*m矩阵,起点@,从矩阵中拿k个物品的最小代价
水BFS
#include "stdio.h" #include "string.h" #include "queue" using namespace std; int b[]={1,2,4,8,16}; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct node { int x,y,step,status; }; int n,m,aim,s_x,s_y; char str[110][110]; int hash[110][110][20]; int bfs() { queue<node>q; node cur,next; int i; cur.x=s_x; cur.y=s_y; cur.step=0; cur.status=0; memset(hash,0,sizeof(hash)); hash[s_x][s_y][0]=1; q.push(cur); while (!q.empty()) { cur=q.front(); q.pop(); for (i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if (next.x<0 || next.y<0 || next.x>=n || next.y>=m) continue; if (str[next.x][next.y]=='#') continue; next.status=cur.status; if (str[next.x][next.y]<=8) next.status|=str[next.x][next.y]; if (hash[next.x][next.y][next.status]==1) continue; hash[next.x][next.y][next.status]=1; next.step=cur.step+1; if (next.status==aim) return next.step; q.push(next); } } return -1; } int main() { int i,j,k; while (scanf("%d%d",&n,&m)!=EOF) { if (n+m==0) break; for (i=0;i<n;i++) scanf("%s",str[i]); for (i=0;i<n;i++) for (j=0;j<m;j++) if(str[i][j]=='@') { s_x=i; s_y=j; } scanf("%d",&k); aim=b[k]-1; while(k--) { scanf("%d%d",&i,&j); i--; j--; str[i][j]=b[k]; } printf("%d\n",bfs()); } return 0; }
标签:blog io ar for sp on 2014 log amp
原文地址:http://blog.csdn.net/u011932355/article/details/40819317