HDU 2612 Find a way

2014-11-23 20:25:32 · 作者: · 浏览: 10
 
//2612 Find a way   
//题意:给一幅图,有墙,有KFC,有路。两个人要去KFC约会,有很多个KFC,问两个人去一间KFC总共走的最少步数   
//广搜水题,居然被初始化卡了两个钟悲剧了。。。对两个人进行BFS,相加步数即可,在网上看到不少人单独写了两个BFS,用两个单独的二维数组去存步数,可以是可以,但是如果真正理解BFS的话,一个BFS一个二维数组就可以了,没有分开的必要,又节约了50行代码量和200*200*4个字节的空间,O(∩_∩)O~   
#include   
#include   
#define MAXN 0x3fffffff;   
using namespace std;  
  
int n, m;  
char map[210][210];  
int cnt[210][210];  
int cnt2[210][210];  
int visited[210][210];  
int vec[4][2]={{0,1},{-1,0},{1,0},{0,-1}};  
  
struct node  
{  
    int x;  
    int y;  
    int step;  
    bool check()  
    {  
        if (x>=0 && x=0 && y Q;  
    Q.push(start);  
    visited[start.x][start.y] = true;  
    while(!Q.empty())  
    {  
        node q = Q.front();  
        Q.pop();  
        for (int i = 0; i<4; i++)  
        {  
            node p = q;  
            p.x = q.x + vec[i][0];  
            p.y = q.y + vec[i][1];  
            p.step ++;  
            if (p.check() && map[p.x][p.y] != '#' && !visited[p.x][p.y])  
            {  
                visited[p.x][p.y] = true;  
                Q.push(p);  
                if (map[p.x][p.y] == '@')  
                {  
                    //BFS精粹   
                    if (num == 1)  
                        cnt[p.x][p.y] = p.step;//第一次   
                    else  
                        cnt[p.x][p.y] += p.step;//第二次   
                }  
            }  
        }  
    }  
}  
  
int main()  
{  
    while (cin>>n>>m)  
    {  
        for (int i = 0; i>map[i][j];  
                if (map[i][j] == 'Y')  
                {  
                    Y.x = i;  
                    Y.y = j;  
                    Y.step = 0;  
                }  
                if (map[i][j] == 'M')  
                {  
                    M.x = i;  
                    M.y = j;  
                    M.step = 0;  
                }  
            }  
        }  
          
        for (i = 0; i
#include #define MAXN 0x3fffffff; using namespace std; int n, m; char map[210][210]; int cnt[210][210]; int cnt2[210][210]; int visited[210][210]; int vec[4][2]={{0,1},{-1,0},{1,0},{0,-1}}; struct node { int x; int y; int step; bool check() { if (x>=0 && x=0 && y Q; Q.push(start); visited[start.x][start.y] = true; while(!Q.empty()) { node q = Q.front(); Q.pop(); for (int i = 0; i<4; i++) { node p = q; p.x = q.x + vec[i][0]; p.y = q.y + vec[i][1]; p.step ++; if (p.check() && map[p.x][p.y] != '#' && !visited[p.x][p.y]) { visited[p.x][p.y] = true; Q.push(p); if (map[p.x][p.y] == '@') { //BFS精粹 if (num == 1) cnt[p.x][p.y] = p.step;//第一次 else cnt[p.x][p.y] += p.step;//第二次 } } } } } int main() { while (cin>>n>>m) { for (int i = 0; i>map[i][j]; if (map[i][j] == 'Y') { Y.x = i; Y.y = j; Y.step = 0; } if (map[i][j] == 'M') { M.x = i; M.y = j; M.step = 0; } } } for (i = 0; i