NOJ [1509] 挖宝

来源:互联网 发布:js 对象 函数 编辑:程序博客网 时间:2024/05/16 23:55
  • 问题描述
  • 小明最近得到了一张藏宝图,藏宝图上有 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 120int 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
原创粉丝点击