标签:枚举 sea yifenfei sizeof mis main otto put sub
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16184 Accepted Submission(s): 5194
题意:Y和M在两个不同起点,他们要到KFC集合,路上有多家KFC,问到哪家KFC能使他们的步数和最少?
思路:两边bfs,分别存取Y和M到各家KFC的步数,相加求和,枚举各KFC输出最小值。
#include<stdio.h> #include<string.h> #include<queue> using namespace std; char a[205][205]; int b[205][205],c[205][205]; int t[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; struct Node{ int x,y,s; }node; int main() { int n,m,yx,yy,mx,my,i,j; while(~scanf("%d%d",&n,&m)){ memset(c,0,sizeof(c)); queue<Node> q; for(i=0;i<n;i++){ getchar(); scanf("%s",a[i]); for(j=0;j<m;j++){ if(a[i][j]==‘Y‘){ yx=i; yy=j; } if(a[i][j]==‘M‘){ mx=i; my=j; } } } memset(b,0,sizeof(b)); b[yx][yy]=1; node.x=yx; node.y=yy; node.s=0; q.push(node); while(q.size()){ for(i=0;i<4;i++){ int tx=q.front().x+t[i][0]; int ty=q.front().y+t[i][1]; if(tx<0||ty<0||tx>=n||ty>=m) continue; if(a[tx][ty]==‘#‘||b[tx][ty]==1) continue; b[tx][ty]=1; if(a[tx][ty]==‘@‘){ c[tx][ty]=q.front().s+11; } node.x=tx; node.y=ty; node.s=q.front().s+11; q.push(node); } q.pop(); } memset(b,0,sizeof(b)); b[mx][my]=1; node.x=mx; node.y=my; node.s=0; q.push(node); while(q.size()){ for(i=0;i<4;i++){ int tx=q.front().x+t[i][0]; int ty=q.front().y+t[i][1]; if(tx<0||ty<0||tx>=n||ty>=m) continue; if(a[tx][ty]==‘#‘||b[tx][ty]==1) continue; b[tx][ty]=1; if(a[tx][ty]==‘@‘){ c[tx][ty]+=q.front().s+11; } node.x=tx; node.y=ty; node.s=q.front().s+11; q.push(node); } q.pop(); } int min=1000000000; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(c[i][j]<min&&c[i][j]!=0) min=c[i][j]; } } printf("%d\n",min); } return 0; }
标签:枚举 sea yifenfei sizeof mis main otto put sub
原文地址:http://www.cnblogs.com/yzm10/p/7252706.html