【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

【题目链接:NYOJ-82

#include<iostream>

#include<cstring>

using namespace std;

struct node{

    int x1;

    int y1;

    int num;

}arry[5];

const int MAXN = 25;

char Map[MAXN][MAXN];



int ac;

int havekey[5];

int findkey[5];



void check();



void dfs(int x,int y){

    if(Map[x][y] != 'X'){

        switch(Map[x][y]){

            case 'a':                

            case 'b':            

            case 'c':            

            case 'd':            

            case 'e':

                findkey[Map[x][y] - 'a']++;

                break;                

            case 'A':

            case 'B':

            case 'C':

            case 'D':

            case 'E':

                arry[Map[x][y] - 'A'].x1 = x;

                arry[Map[x][y] - 'A'].y1 = y;

                arry[Map[x][y] - 'A'].num++;

                return;

            case 'G':

                ac = true;

                return;                

        }

        Map[x][y] = 'X'; //标记已经走过 

        dfs(x - 1,y);

        dfs(x + 1,y);

        dfs(x,y - 1);

        dfs(x,y + 1);

        check();

    }

}

void check(){

    for(int i = 0;i < 5;i++){

        if(arry[i].num){

            if(findkey[i] == havekey[i]){

                Map[arry[i].x1][arry[i].y1] = 'X';

                dfs(arry[i].x1 + 1,arry[i].y1);

                dfs(arry[i].x1 - 1,arry[i].y1);

                dfs(arry[i].x1,arry[i].y1 + 1);

                dfs(arry[i].x1,arry[i].y1 - 1);

            }

        }

    }

}

int main(){

    int m,n;

    while((cin >> m >> n) && (m || n)){

        memset(havekey,0,sizeof(havekey));

        memset(findkey,0,sizeof(findkey));

        memset(arry,0,sizeof(arry));

        memset(Map,'X',sizeof(Map));//初始边界,否则递归搜索时,会越界空指针 

        ac = 0;



        int a1,b1;

        

        for(int i = 1;i <= m;i++){

            for(int j = 1;j <= n;j++){

                cin >> Map[i][j];

                if(Map[i][j] == 'S')

                    a1 = i,b1 = j;

                else if(Map[i][j] >= 'a' && Map[i][j] <= 'e')//将其保存至数组 

                    havekey[Map[i][j] - 'a']++;

            }

        }

        dfs(a1,b1);

        if(ac){

            cout << "YES" << endl;

        }else cout << "NO" << endl;

    }

    return 0;

}

//4 4

//S.X.

//a.X.

//..XG

//.... 

//3 4

//S.Xa

//.aXB

//b.AG

//0 0

 

你可能感兴趣的:(DFS)