一道ACM题,用BFS做,样例一样,可就是wrong answer,求指教 25
这是链接:http://acm.nuc.edu.cn/OJ/problem.php?pid=1215我写的代码:#include"stdio.h"#include"str...
这是链接:http://acm.nuc.edu.cn/OJ/problem.php?pid=1215
我写的代码:
#include "stdio.h"
#include "string.h"
#define M 2002
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
void BFS (int x,int y);
char map[M][M];
int count;
int main ()
{
int n,m,i,j,k,flag;
int x,y;
char c[M];
while (scanf ("%d %d",&n,&m) != EOF)
{
count = 0;
flag = 0;
getchar ();
for (i = 1;i <= n;i ++)
{
gets(c);
k = 0;
j = 1;
while (c[k] != '\0')
{
map[i][j++] = c[k++];
}
memset (c,'\0',sizeof(c));
}
for (i = 0;i <=n+1;i ++)
{
for (j =0;j <= m+1;j ++)
if (i==0||j==0||i==n+1||j==m+1)
map[i][j] = '#';
}
for (i = 1;i <= n;i ++)
{
for (j = 1;j <= m;j ++)
{
if (map[i][j] == 'X')
{
x = i;
y = j;
flag = 1;
break;
}
}
if (flag) break;
}
BFS(x,y);
printf ("%d\n",count);
memset (map,'\0',sizeof(map));
}
return 0;
}
void BFS (int x,int y)
{
int X,Y,i;
if (map[x][y] == '*')
count ++;
if (map[x][y] == '#')
return ;
map[x][y] = '1';
for (i = 0;i < 4;i ++)
{
X = x + dx[i];
Y = y + dy[i];
if (map[X][Y] == '#'||map[X][Y]== '1') continue;
else
BFS (X,Y);
}
}
请教牛人指教,谢谢啦
Description:
keefo 正在一个迷宫里找宝藏. keefo好不容易找到这个迷宫,这个迷宫传说中藏了不少的宝藏,当然他希望这次能够找出所所有的宝藏. 现在,他已经从杨过那里获得宝藏地图, 现在 keefo 想知道他能够获得多少宝藏.keefo 希望你能够帮他解决这个问题(呵呵~,不是白干哦, keefo会付给你酬金).
现在假设,迷宫是由正方形网格组成 . keefo在迷宫中,只能从 上 ,下,左,右四个方向移动. 但是如果他要走的前方是一堵墙的话,他将不能走过去. 并且,迷宫的四周都是由一堵厚实的墙包围着, 也就是说,keefo不可能走出迷宫之外.
Input:
输入包含多组测试数据.
每组测试数据第一行包含两个整形数字, N 和 M ( 1 < N,M <= 1000 ), 分别表示迷宫网格的行和列.接下来N行里,每行包含了M个字符.( ´X´ 代表 keefo 当前位置 , ´*´ 代表宝藏 , ´#´代表墙, ´.´ 代表没有任何障碍 ). 每个测试数据只包含一个 ´X´ 字符.
Output:
输出keefo 能够找到的最多宝藏的个数.
每组数据一行.
Example Input:
4 4
*...
.X..
....
...*
4 4
*#..
#X..
....
...*Example Output:
2
1 展开
我写的代码:
#include "stdio.h"
#include "string.h"
#define M 2002
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
void BFS (int x,int y);
char map[M][M];
int count;
int main ()
{
int n,m,i,j,k,flag;
int x,y;
char c[M];
while (scanf ("%d %d",&n,&m) != EOF)
{
count = 0;
flag = 0;
getchar ();
for (i = 1;i <= n;i ++)
{
gets(c);
k = 0;
j = 1;
while (c[k] != '\0')
{
map[i][j++] = c[k++];
}
memset (c,'\0',sizeof(c));
}
for (i = 0;i <=n+1;i ++)
{
for (j =0;j <= m+1;j ++)
if (i==0||j==0||i==n+1||j==m+1)
map[i][j] = '#';
}
for (i = 1;i <= n;i ++)
{
for (j = 1;j <= m;j ++)
{
if (map[i][j] == 'X')
{
x = i;
y = j;
flag = 1;
break;
}
}
if (flag) break;
}
BFS(x,y);
printf ("%d\n",count);
memset (map,'\0',sizeof(map));
}
return 0;
}
void BFS (int x,int y)
{
int X,Y,i;
if (map[x][y] == '*')
count ++;
if (map[x][y] == '#')
return ;
map[x][y] = '1';
for (i = 0;i < 4;i ++)
{
X = x + dx[i];
Y = y + dy[i];
if (map[X][Y] == '#'||map[X][Y]== '1') continue;
else
BFS (X,Y);
}
}
请教牛人指教,谢谢啦
Description:
keefo 正在一个迷宫里找宝藏. keefo好不容易找到这个迷宫,这个迷宫传说中藏了不少的宝藏,当然他希望这次能够找出所所有的宝藏. 现在,他已经从杨过那里获得宝藏地图, 现在 keefo 想知道他能够获得多少宝藏.keefo 希望你能够帮他解决这个问题(呵呵~,不是白干哦, keefo会付给你酬金).
现在假设,迷宫是由正方形网格组成 . keefo在迷宫中,只能从 上 ,下,左,右四个方向移动. 但是如果他要走的前方是一堵墙的话,他将不能走过去. 并且,迷宫的四周都是由一堵厚实的墙包围着, 也就是说,keefo不可能走出迷宫之外.
Input:
输入包含多组测试数据.
每组测试数据第一行包含两个整形数字, N 和 M ( 1 < N,M <= 1000 ), 分别表示迷宫网格的行和列.接下来N行里,每行包含了M个字符.( ´X´ 代表 keefo 当前位置 , ´*´ 代表宝藏 , ´#´代表墙, ´.´ 代表没有任何障碍 ). 每个测试数据只包含一个 ´X´ 字符.
Output:
输出keefo 能够找到的最多宝藏的个数.
每组数据一行.
Example Input:
4 4
*...
.X..
....
...*
4 4
*#..
#X..
....
...*Example Output:
2
1 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询