程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2612 Find a way

HDU 2612 Find a way

編輯:C++入門知識

 
//2612 Find a way   
//題意:給一幅圖,有牆,有KFC,有路。兩個人要去KFC約會,有很多個KFC,問兩個人去一間KFC總共走的最少步數   
//廣搜水題,居然被初始化卡了兩個鐘悲劇了。。。對兩個人進行BFS,相加步數即可,在網上看到不少人單獨寫了兩個BFS,用兩個單獨的二維數組去存步數,可以是可以,但是如果真正理解BFS的話,一個BFS一個二維數組就可以了,沒有分開的必要,又節約了50行代碼量和200*200*4個字節的空間,O(∩_∩)O~   
#include<iostream>   
#include<queue>   
#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<n && y>=0 && y<m)  
            return true;  
        return false;  
    }  
}Y, M;  
  
void BFS(node start, int num)  
{  
    memset(visited, 0, sizeof(visited));  
    queue<node> 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<n; i++)  
        {  
            for (int j = 0; j<m; j++)  
            {  
                cin>>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<n; i++)  
            for (int j = 0; j<m; j++)  
               cnt[i][j] = cnt2[i][j] = MAXN;  
        BFS(Y, 1);  
        BFS(M, 2);  
  
        int min = MAXN;  
        for (i = 0; i<n; i++)  
        {  
            for (int j = 0; j<m; j++)  
            {  
                if (map[i][j] == '@' && (cnt[i][j] < min))  
                    min =  cnt[i][j];  
            }  
        }  
        cout<<min * 11<<endl;  
    }  
    return 0;  
}  

//2612 Find a way
//題意:給一幅圖,有牆,有KFC,有路。兩個人要去KFC約會,有很多個KFC,問兩個人去一間KFC總共走的最少步數
//廣搜水題,居然被初始化卡了兩個鐘悲劇了。。。對兩個人進行BFS,相加步數即可,在網上看到不少人單獨寫了兩個BFS,用兩個單獨的二維數組去存步數,可以是可以,但是如果真正理解BFS的話,一個BFS一個二維數組就可以了,沒有分開的必要,又節約了50行代碼量和200*200*4個字節的空間,O(∩_∩)O~
#include<iostream>
#include<queue>
#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<n && y>=0 && y<m)
			return true;
		return false;
	}
}Y, M;

void BFS(node start, int num)
{
   	memset(visited, 0, sizeof(visited));
	queue<node> 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<n; i++)
		{
			for (int j = 0; j<m; j++)
			{
				cin>>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<n; i++)
	    	for (int j = 0; j<m; j++)
			   cnt[i][j] = cnt2[i][j] = MAXN;
		BFS(Y, 1);
		BFS(M, 2);

		int min = MAXN;
		for (i = 0; i<n; i++)
		{
			for (int j = 0; j<m; j++)
			{
				if (map[i][j] == '@' && (cnt[i][j] < min))
					min =  cnt[i][j];
			}
		}
		cout<<min * 11<<endl;
	}
	return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved