poj 1979 Red and Black

本文介绍了一种利用广度优先搜索(BFS)和深度优先搜索(DFS)解决棋盘上从黑色棋子出发,寻找所有可达黑色棋子数量的问题。详细解释了算法实现过程,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始你站在黑色的格子上, 每次可以上下左右走到相连的黑色格子, 但不能是红色格子, 求能走到的格子数

图的遍历, bfs和dfs都可以, 时间差不多


bfs

#include <cstdio>
int dx[] = {0, -1, 1, 0, 0};
int dy[] = {0, 0, 0, -1, 1};
char room[25][25], s[25];
bool vis[25][25];
int q[410];
int h, w;
void bfs(int x, int y)
{
  int front, rear, u;
  int count = 0;
  front = rear = 1;
  u = x*w+y;
  q[rear++] = u;
  count++;
  while(front < rear)
    {
      x = (q[front]-1)/w;
      y = (q[front++]-1)%w + 1;
      for(int i=1; i<=4; i++)
      	{
          int nx = x+dx[i];
          int ny = y+dy[i];
          if(room[nx][ny] == '.' && !vis[nx][ny])
          	 {
          	   vis[nx][ny] = 1;
          	   q[rear++] = nx*w+ny;
          	   count++;
          	 }
      	}
    }
   printf("%d\n", count);
   return;
}
int main()
{
  while(scanf("%d %d", &w, &h), w, h)
    {
      int sx, sy;
      for(int i=0; i<25; i++)
      	 for(int j=0; j<25; j++)
      	 	{
      	 	  room[i][j] = '#';
      	 	  vis[i][j] = 0;
      	 	}
      getchar();
      for(int i=1; i<=h; i++)
      	 {
      	   scanf("%s", s);
      	   for(int j=1; j<=w; j++)
      	   	 room[i][j] = s[j-1];
      	 }
      for(int i=1; i<=h; i++)
      	 for(int j=1; j<=w; j++)
      	 	if(room[i][j] == '@')
      	 	  {
      	 	  	sx = i;
      	 	  	sy = j;
      	 	  	break;
      	 	  }
      bfs(sx, sy);
    }
  return 0;
}



dfs

#include <cstdio>
#include <cstring>
int dx[] = {0, -1, 1, 0, 0};
int dy[] = {0, 0, 0, -1, 1};
char room[25][25];
bool vis[25][25];
int sx, sy;
char s[25];
int count;
void dfs(int x, int y)
{
  count++;
  for(int i=1; i<=4; i++)
   {
   	int nx = x+dx[i];
   	int ny = y+dy[i];
   	if(room[nx][ny] == '.' && !vis[nx][ny])
   	  {
        vis[nx][ny] = 1;
   	  	dfs(nx, ny);
   	  	//vis[nx][ny] = 0;
   	  }
   }
}
int main()
{
	int w, h;
	while(scanf("%d %d", &w, &h), w, h)
	  {
        getchar();
	  	for(int i=0; i<25; i++)
	  	   for(int j=0; j<25; j++)
	  	   	 room[i][j] = '#';
	  	memset(vis, 0, sizeof(vis));
	  	for(int i=1; i<=h; i++)
	  	  {
            scanf("%s", s);
            for(int j=1; j<=w; j++)
              room[i][j] = s[j-1];
	  	  }
        for(int i=1; i<=h; i++)
          for(int j=1; j<=w; j++)
          	 if(room[i][j] == '@')
               {
                 sx = i;
                 sy = j;
                 break;
               }
        count = 0;
        vis[sx][sy] = 1;
        dfs(sx, sy);
        printf("%d\n", count);
      }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值