codeforces#290 B&&510 B Fox And Two Dots (dfs)

本文介绍了一个CodeForces上的题目解决方案,该题目要求在矩阵中找出至少四个相同字母构成的闭环。通过深度优先搜索(DFS)算法实现,详细记录了从思路到代码调试的全过程。

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

题目链接:codeforces

题目大意:

 给一个矩阵,里面有不同字母,找到可以连成一圈的,最少4个以上,找到输出yes 否注no

思路:

看到题目,第一感觉就觉得是应该要用到搜素,使用dfs 对每个点搜素,从该点开始,寻找下一个符合要求的点。(下一个点要和自身相同,并且在矩阵内)每个点都上下左右走,但是不能往回走,一直走下去,直到又经过相同的位置,说明找到可以连成一圈的了。(对每个符合要求的点,走过vis就标记成1,如果遇到符合要求的下一个点,并且这个点的vis已经是1了 ,就说明走过了,绕了一圈回来了)

总结一下最近做的dfs: 好像就一次按照思路写完就直接ac了,其余都debug好久,dfs的题目感觉debug说简单也简单,按照思路不会错,但是有时候却死都找不到,这题debug了半个多小时。下次写dfs类型的题目,思路一定要清晰,写的时候要细心,递归判断条件要注意写对。这次就是因为递归判断是否找到,没注意写成vis[x][y],一直查不出,正确是判断下一步vis[next_x][next_y]。不该使用单步慢慢调试,使用输出调试更快,代码能力有很大的进步空间!
AC代码:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int vis[110][110], tx[4] = { 0,0,-1,1 }, ty[4] = {-1,1,0,0},flag=0,m,n;
char map[110][110];

int judge(int x, int y)
{
    if (x < 0 || x >= n || y < 0 || y >= m)
        return 0;
    else return 1;
}
void dfs(int x, int y, int fx, int fy)
{
    if (!judge(x, y))return;
    vis[x][y] = 1;
    int i;
    for (i = 0; i < 4; ++i)
    {
        int next_x = x + tx[i];
        int next_y = y + ty[i];
        if (judge(next_x, next_y) && map[x][y] == map[next_x][next_y] && (next_x != fx||next_y != fy))
        {
            if (vis[next_x][next_y])
            {
                flag = 1;
                return;
            }
            dfs(next_x, next_y, x, y);
        }
    }
    return;
}
int main()
{
    int i,j;
    memset(vis, 0, sizeof(vis));
    cin >> n >> m;
    for (i = 0; i < n; ++i)
        cin >> map[i];
    for(i=0;i<n;++i)
        for (j = 0; j < m; ++j)
        {
            if (!vis[i][j])
            {
                dfs(i, j, -1, -1);
            }
        }
    if (flag)cout << "Yes";
    else cout << "No";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值