- 问题描述
-
小明最近得到了一张藏宝图,藏宝图上有 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] 挖宝
最新推荐文章于 2023-04-24 09:55:02 发布