Oh,mygoddess
很早的时候就看了这一道题目 , 当时不会做 , 现在 边听歌边写无压力 ........
题意 : 光辉骑士 一直都在 迷宫的右上角 , 第一行给你迷宫的规格 , 下面是迷宫 "O" 代表空地需要花一个单位时间跨越 , "#" 代表
墙 ,需要三个单位的时间把墙破开 , 也就是 "O"为一个时间 "#"为4个时间 .
下面附上代码 .
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; struct node { int x,y,step; friend bool operator <(node s1,node s2) { return s1.step>s2.step; } }; char a[52][52]; int n,m,tx,ty,b[4][2]={0,-1,0,1,-1,0,1,0},visited[52][52]; priority_queue<node>Q; int BFS(int x,int y) { node q={x,y,0}; Q.push(q); while(!Q.empty()) { node e=Q.top(); // 怎么会把 这里 忘了呢 ? Q.pop(); for(int i=0;i<4;i++) { q.x=e.x+b[i][0],q.y=e.y+b[i][1]; //怎么 整天 都 弄错 ? if(q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!visited[q.y][q.x]) { if(a[q.y][q.x]=='O') q.step=e.step+1; if(a[q.y][q.x]=='#') q.step=e.step+4; visited[q.y][q.x]=1; Q.push(q); if(q.x==tx&&q.y==ty) //注意 安放的位置 { return q.step; } } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf(" %c",&a[i][j]); } } scanf("%d%d",&ty,&tx); tx--; ty--; memset(visited,0,sizeof(visited)); visited[0][0]=1; while(!Q.empty()) // 注意 清空 Q.pop(); int mark=BFS(0,0); printf("%d\n",mark); } }