【BFS】C++羊和狼

使用BFS算法,通过遍历米基家后院的每个空地,判断羊和狼的数量,计算战斗结束后羊和狼的总数量。在每个连通块中,羊多于狼则羊存活,否则狼存活。
摘要由CSDN通过智能技术生成
题目

米基家的后院养着一群羊,米基由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构
成的长方形区域,每个方格中用字符‘?’表示空地,‘#’表示栅栏,‘o’表示羊,‘v’表示狼,羊和狼所在的
格子都是空地。如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地B,则称空地A和空地B属
于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。当一个羊圈中羊的数量大于狼的数量时
,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。写一个程序统
计战斗结束后所有羊圈中羊的总数和狼的总数。

输入

第一行包含两个用空格隔开的自然数R和C,其中3<=R,C<=250,R表示米基家后院的行数,C表示列数,接下来的R行
每行包含C个字符,每个字符表示一个格子的情况

输出

仅一包含两个用一个空格隔开的整数,表示要求的羊的数量和狼的数量。

样例输入

9 12
.###.#####…
#.oo#…#v#.
#…o#.#.#.#.
#…##o#…#.
#.#v#o###.#.
#…#v#…#.
#…v#v####.
.####.#vv.o#
…####.

样例输出

3 5

以下是、菜和农夫过河问题的C++代码实现,使用了BFS(广度优先搜索)算法: ```cpp #include <bits/stdc++.h> using namespace std; struct node { int wolf, sheep, vegetable, farmer, step; // 、菜、农夫位置以及步数 }; bool vis[15][15][15][2]; // 记录状态是否出现过 bool is_valid(int wolf, int sheep, int vegetable) { // 判断当前状态是否合法 if(wolf == sheep && wolf != vegetable) return false; if(sheep == vegetable && wolf != sheep) return false; return true; } int bfs(int wolf, int sheep, int vegetable) { queue<node> q; memset(vis, false, sizeof(vis)); q.push({wolf, sheep, vegetable, 0, 0}); vis[wolf][sheep][vegetable][0] = true; while(!q.empty()) { node cur = q.front(); q.pop(); if(cur.wolf == 1 && cur.sheep == 1 && cur.vegetable == 1) return cur.step; for(int i = 0; i < 2; i++) { int newfarmer = (cur.farmer + i) % 2; if(cur.wolf == cur.sheep && cur.wolf == newfarmer) continue; if(cur.vegetable == cur.sheep && cur.vegetable == newfarmer) continue; if(cur.vegetable == cur.wolf && cur.vegetable == newfarmer) continue; int newwolf = cur.wolf, newsheep = cur.sheep, newvegetable = cur.vegetable; if(newfarmer == 0) { newwolf = cur.wolf - i; newsheep = cur.sheep; newvegetable = cur.vegetable - i; } else { newwolf = cur.wolf + i; newsheep = cur.sheep + i; newvegetable = cur.vegetable; } if(newwolf < 0 || newwolf > 1 || newsheep < 0 || newsheep > 1 || newvegetable < 0 || newvegetable > 1) continue; if(!is_valid(newwolf, newsheep, newvegetable)) continue; if(vis[newwolf][newsheep][newvegetable][newfarmer]) continue; vis[newwolf][newsheep][newvegetable][newfarmer] = true; q.push({newwolf, newsheep, newvegetable, newfarmer, cur.step + 1}); } } return -1; } int main() { int ans = bfs(1, 1, 1); printf("%d\n", ans); return 0; } ``` 其中,`vis`数组记录状态是否出现过,`is_valid`函数用于判断当前状态是否合法,`bfs`函数使用队列实现广度优先搜索,搜索过程中更新状态,并将新状态加入队列中,直到搜索到目标状态或者队列为空。最终输出最少需要多少步才能将、菜和农夫运送到对岸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值