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;
    }


你可能感兴趣的:(NOJ [1509] 挖宝)