Algorithm --> DFS和BFS

定义结点

struct MGraph
{
    int vexs[MAXVEX];        //顶点数组
    int arc[MAXVEX][MAXVEX]; //邻接矩阵
    int numVertex, numEdges;  //定点数 边数
};

深度优先遍历

图示

     

参考代码

bool visited[MAX];
void DFS(MGraph G, int i)
{
    cout << G.vexs[i] << " ";
   visited[i] = true;
    for (int j = 0; j < G.numVertex; ++j)
    {
        if (G.arc[i][j] == 1 && !visited[j])
            DFS(G, j);
       }
}
void DFSTranverse(MGraph G)
{
    for (int i = 0; i < G.numVertex; ++i)
        visited[i] = false;
    for (int i = 0 ; i < G.numVertex; ++i)  //如果是连通图,只执行一次
    {
        if (!visited[i])
            DFS(G, i);
    }
}

广度优先遍历

图示

     

参考代码

void BFSTranverse(MGraph G)
{
    queue<int> q;
    bool visited[G.numVertex];
    for (int i = 0; i < G.numVertex; ++i)
        visited[i] = false;
    for (int i = 0; i < G.numVertex; ++i)
    {
        if (!visited[i])
        {
            cout << G.vexs[i] << " ";
            q.push(i);
             visited[i] = true;
             while (!q.empty())
              {
                   int k = q.top();
                   q.pop();
                    for (int j = 0; j < G.numVertex; ++j)
                    {
                        if (G.arc[i][j] == 1 && !visitied(j))
                            {
                                cout << G.vexs[j] << " ";
                                visited[j] = true;
                                q.push(j);
                            }
                     }
                }
            }
   }//for
}

另一种:

void BFS()
{
    visited[1] = 1;
    queue q;
    q.push(1);
    while(!q.empty())
    {
       int top = q.front();
       cout << top<<" ";//输出
       q.pop();
       int i ;
       for(i = 1; i <= M; ++i)
       {
        if(visited[i] == 0 && matrix[top - 1][i - 1 ] == 1)
        {
         visited[i] = 1;
         q.push(i);
        }
       }
    }
}

/******************* 2015.07.06 update ************************/

BFS:

#include <stdio.h>

int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
int map[10][10] = { 0 };

int queue[100][2] = {0};
int front = 0;
int back = 0;
int parent[10][10][2] = {0};

void BFS(int sY, int sX, int eY, int eX)
{
    queue[back][0] = sY;
    queue[back++][1] = sX;
    map[sY][sX] = 1;
    while (front < back)
    {
        int Y = queue[front][0];
        int X = queue[front][1];
        for (int i = 0; i < 4; i++)
        {
            int newY = Y + o[i][0];
            int newX = X + o[i][1];
            if (map[newY][newX] == 0)continue;
            if (map[newY][newX] > (map[Y][X] + 1))
            {
                map[newY][newX] = map[Y][X] + 1;
                parent[newY][newX][0] = Y;
                parent[newY][newX][1] = X;
                if ((newY == eY) && (newX == eX))
                {
                    return;
                }
                queue[back][0] = newY;
                queue[back++][1] = newX;
            }
        }

        front++;
    }
}

int main(int argc, char** argv)
{
    freopen("input.txt", "r", stdin);
    int N;
    scanf("%d
", &N);
    for (int case_num = 0; case_num < N; case_num++)
    {
        for (int i = 1; i <= 8; i++)
        {
            for (int j = 1; j <= 8; j++)
            {
                scanf("%d
", &map[i][j]);
                if (map[i][j] == 1)map[i][j] = 100;
            }
            scanf("
");
        }
    }

    BFS(1, 1, 8, 8);
    if (map[8][8] == 100)printf("failed
");
    else printf("%d
", map[8][8]);

    int x = 8, y = 8;
    int stack[100][2] = {0};
    int step = 0;
    while (x > 0 || y > 0)
    {
        stack[step][0] = y;
        stack[step++][1] = x;
        int newY = parent[y][x][0];
        int newX = parent[y][x][1];
        x = newX;
        y = newY;
    }

    for (int i = step - 1; i >= 0; i--)
    {
        printf("%d %d
", stack[i][0], stack[i][1]);
    }
}
View Code

DFS:

#include <stdio.h>

int o[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
int map[10][10] = {0};
int minStep = 100;
int stack[100][2] = {0};
int step = 0;
int minStack[100][2] = {0};

void DFS(int sY, int sX, int eY, int eX)
{
    if (step >= minStep)return;
    if (map[sY][sX] == 0)return;
    stack[step][0] = sY;
    stack[step++][1] = sX;
    map[sY][sX] = 0;
    if ((sY == eY) && (sX == eX))
    {
        if (minStep > step)
        {
            minStep = step;
            for (int i = 0; i < step; i++)
            {
                minStack[i][0] = stack[i][0];
                minStack[i][1] = stack[i][1];
            }
        }
        map[sY][sX] = 1;
        step--;
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        (DFS(sY + o[i][0], sX + o[i][1], eY, eX));
    }

    map[sY][sX] = 1;
    step--;
    return;
}

int main(int argc, char** argv)
{
    freopen("input.txt", "r", stdin);
    int N;
    scanf("%d
", &N);
    for (int case_num = 0; case_num < N; case_num++)
    {
        for (int i = 1; i <= 8; i++)
        {
            for (int j = 1; j <= 8; j++)
            {
                scanf("%d
", &map[i][j]);
            }
            scanf("
");
        }
    }

    DFS(1,1,8,8);
    printf("%d
", minStep-1);
    for (int i = 0; i < minStep; i++)
    {
        printf("%d %d
", minStack[i][0], minStack[i][1]);
    }
    //if (ret)printf("success
");
    //else printf("failed
");
}
View Code

input:

1
1 2 0 1 1 1 0 1 
2 3 0 1 1 0 0 1
2 3 1 3 0 0 1 1 
2 0 0 0 1 1 1 1 
2 3 3 0 1 1 0 1 
2 0 1 1 1 0 0 1 
2 0 0 0 1 0 0 1 
0 1 1 1 1 1 1 1
View Code
原文地址:https://www.cnblogs.com/jeakeven/p/4607337.html