NOJ [1509] 挖宝

  • 问题描述
  • 小明最近得到了一张藏宝图,藏宝图上有 N*M 个格子,每个格子代表一个坐标。
    但是他仔细一看,藏宝阁上只有三种标记,一种是'X',一种是'O',还有一种是'.'。
    他又发现藏宝图旁边有个注释:'X'代表这个格子不能走;'O'代表这个格子也许有宝藏;'.'代表这个格子可以走。

    小明很快便找到了这张藏宝图所指的地区,然后开始寻找藏宝图。
    但是小明很贪心,他想尽可能多的得到财宝,所以他决定把他所能到达的每个'O'都寻找一遍。
    首先,小明不能走出这张藏宝图的地区。
    其次,小明不能走到标记为'X'的格子上。
    最后,小明只能走到相邻的四个格子的其中一个上去。
    问你小明最多挖了几次宝藏。
  • 输入
  • 输入第一行为两个正整数N和M(4 <= N,M <= 100),代表这张藏宝图有N行M列。
    接下来N行,每行M列。每个格子为'X','O'或'.'之一。
    最后一行为x(0 <= x <= N - 1)和y(0 <= y <= M - 1),表示小明目前所在的位置,保证该位置一定是'.'。
  • 输出
  • 输出小明最多挖了几次宝藏。

    普通的dfs题
    #include<stdio.h>
    #include<string.h>
    #define maxn 120
    int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    bool mark[maxn][maxn];
    char mat[maxn][maxn];
    int n,m;
    int cnt;
    void dfs(int x,int y)
    {
        if(mark[x][y])
          return ;
        mark[x][y]=1;
        if(mat[x][y]=='O')cnt++;
    	for(int i=0;i<4;i++)
    	{
    		int newx=x+dir[i][0];
    		int newy=y+dir[i][1];
    		if(newx<0 || newx>=n || newy<0 || newy>=m)
    		  continue;
            else if(mat[newx][newy]=='X') continue;
    	    dfs(newx,newy);
    	}
    }
    
    int main()
    {
    	while(~scanf("%d%d",&n,&m))
    	{
    		memset(mark,0,sizeof(mark));
    		int i,j;
    		int sx,sy;
    		cnt=0;
    		for(i=0;i<n;i++)
    		  scanf("%s",mat[i]);
            scanf("%d%d",&sx,&sy);
            dfs(sx,sy);
            printf("%d\n",cnt);
    	}
    	return 0;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值