C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

NYOJ 82 迷宫寻宝(一) 解题报告

Posted on 2012-01-15 17:53 C小加 阅读(567) 评论(0)  编辑 收藏 引用 所属分类: 解题报告
简单DFS,数据很弱。。


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char map[23][23];
typedef struct
{
    int x,y;
    int flag;
}point;
point p[5];
int _max[5];
int _num[5];
int flag;
void door();
void dfs(int x,int y)
{
    if(map[x][y]!='X')
    {
        switch(map[x][y])
        {
        case 'a': _num[0]++;break;
        case 'b': _num[1]++;break;
        case 'c': _num[2]++;break;
        case 'd': _num[3]++;break;
        case 'e': _num[4]++;break;
        case 'A': {p[0].x=x;p[0].y=y;p[0].flag++;return;}
        case 'B': {p[1].x=x;p[1].y=y;p[1].flag++;return;}
        case 'C': {p[2].x=x;p[2].y=y;p[2].flag++;return;}
        case 'D': {p[3].x=x;p[3].y=y;p[3].flag++;return;}
        case 'E': {p[4].x=x;p[4].y=y;p[4].flag++;return;}
        case 'G': {flag=1;return;}
        }


        map[x][y]='X';//说明此路已走过
        dfs(x-1,y);
        dfs(x,y+1);
        dfs(x+1,y);
        dfs(x,y-1);
        door();


    }

}

//如果钥匙够了就打开这扇门
void door()
{
    for(int i=0;i<5;i++)
        {
            if(p[i].flag)
            {

                if(_num[i]==_max[i])
                {
                    map[p[i].x][p[i].y]='X';
                    dfs(p[i].x-1,p[i].y);
                    dfs(p[i].x,p[i].y+1);
                    dfs(p[i].x+1,p[i].y);
                    dfs(p[i].x,p[i].y-1);

                }
            }
        }
}


int main()
{
    //freopen("input.txt","r",stdin);
    int m,n;
    int sx,sy;

    while(cin>>m>>n,m+n)
    {
        //初始化
        flag=0;
        memset(_max,0,sizeof(_max));
        memset(_num,0,sizeof(_num));
        memset(p,0,sizeof(p));
        memset(map,'X',sizeof(map));

      for(int i=1;i<=m;i++)
      {
          for(int j=1;j<=n;j++)
          {
                cin>>map[i][j];
                if(map[i][j]=='S') {sx=i;sy=j;}//入口
                
//初始化最大钥匙数量
                else if(map[i][j]=='a') _max[0]++;
                else if(map[i][j]=='b') _max[1]++;
                else if(map[i][j]=='c') _max[2]++;
                else if(map[i][j]=='d') _max[3]++;
                else if(map[i][j]=='e') _max[4]++;

          }
      }
    dfs(sx,sy);
    door();

    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;




    }


    return 0;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理