6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13
- #include<iostream>
- #include<string.h>
- #include<stdio.h>
- using namespace std;
- int direct[4][2] = { -1, 0, 1, 0, 0, 1, 0, -1 }; /*定义方向, 左右,上下*/
- char map[21][21]; /*输入的字符串*/
- bool mark[21][21]; /*标记走过的路程*/
- bool flag;
- int W, H;
- int Dx, Dy; //记录起始位置@,从这里开始进行搜索
- int ans; //记录满足的个数。初始化为1,因为@也包含在内
- /*****底下是核心算法,主要是从
- 上下左右这四个方向进行搜索,注意
- 满足搜索的条件是不能越界,不能是#,
- 还有就是没有搜索过的--》主要是靠mark[i][j]
- 来实现*******/
- void DFS( int x, int y )
- {
- mark[x][y] = true;
- for( int k = 0; k < 4; k ++ )
- {
- int p = x + direct[k][0];
- int q = y + direct[k][1];
- if( p >= 0 && q >= 0 && p < H && q < W && !mark[p][q] && map[p][q] != '#' )
- {
- ans ++;
- DFS( p, q );
- }
- }
- return;
- }
- int main()
- {
- int i, j, k;
- while( cin >> W >> H && ( W || H ) ) // W -> column, H -> row;
- {
- memset( mark, false, sizeof( mark ) );
- for( i = 0; i < H; i ++ )
- for( j = 0; j < W; j ++ )
- {
- cin >> map[i][j];
- if( map[i][j] == '@' )
- {
- Dx = i;
- Dy = j;
- }
- }
- ans = 1;
- DFS( Dx, Dy );
- cout << ans << endl;
- }
- }
题目大意:一个矩形空间,上有黑色同红色两种砖,求从某一黑砖出发可以经过的黑砖的数目
原先用DFS做的,但调试很久都不知哪里出错,后来改用BFS
#include<stdio.h>
#include<queue>
using namespace std;
int n,m,total;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
char map[20][20];
typedef struct
{
int x,y;
}point;
point start;
int bfs(point start)
{
queue<point>q;
int i;
point cur,next;
map[start.x][start.y]='#';
q.push(start);
while(!q.empty())
{
cur=q.front();
q.pop();
for(i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>=0&&next.x<m&&next.y>=0&&next.y<n)
if(map[next.x][next.y]!='#')
{
map[next.x][next.y]='#';
total++;
q.push(next);
}
}
}
return total;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0)
{
getchar();
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='@')
{start.x=i;start.y=j;}
}
getchar();
}
total=1;
printf("%d\n",bfs(start));
}
return 0;
}