17-比赛2 F - Fox And Two Dots (dfs)

本文详细解析了CodeForces-510B FoxAndTwoDots题目,介绍了如何通过深度优先搜索(DFS)算法来判断是否能在给定的字符网格中找到至少四个相同字母形成的循环路径。利用标记已访问节点的方法避免重复访问,并在遇到已访问的相邻相同字母节点时确认找到了所需的循环。

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

     Fox And Two Dots 

          CodeForces - 510B 
=================================================================================================================================
题意:是能否找到一连串同样的字母至少四个形成循环(贯通)
通过dfs 按照相同的字母遍历一遍, 且阻止其走回头路,那么深搜之后再次搜到被标记的点,则肯定就形成了循环。
详情解释,见代码。
=================================================================================================================================
 代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 char Map[100][100];
 5 bool book[100][100];
 6 bool flag;
 7 void dfs(int y,int x,int rey,int rex)
 8 {
 9     for(int i =1;i<=4;i++)
10     {
11         int ty=y,tx=x;
12         if(i==1) ty++;   //四个方向
13         if(i==2) ty--;
14         if(i==3) tx++;
15         if(i==4) tx--;
16         if(ty<1||ty>n||tx<1||tx>m) continue;
17         if(ty==rey&&tx==rex) continue; //阻止往回走
18         if(Map[y][x]==Map[ty][tx])     //确保是相同的字母
19         {
20             if(book[ty][tx]==1) {flag = 1;break;}
21             book[ty][tx]=1; 
22             dfs(ty,tx,y,x);
23         }
24     }
25     return;
26 }
27 int main()
28 {
29         scanf("%d %d",&n,&m);
30         for(int y = 1;y<=n;++y)
31             for(int x=1;x<=m;++x)
32         {
33             cin>>Map[y][x];
34         }
35 
36         for(int y = 1;y<=n;++y)
37         {
38             for(int x=1;x<=m;++x)
39             {
40                 if(book[y][x]==1) continue;
41                 book[y][x]=1;   //走过的点都标记上
42                 dfs(y,x,0,0);
43                 if(flag==1) break;
44             }
45             if(flag==1) break;
46         }
47         printf(flag==1?"Yes\n":"No\n");
48 }

 

转载于:https://www.cnblogs.com/darkboy/p/9416169.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值