Fox And Two Dots (Codeforces Round #290 (Div. 2)B)

题目大意:

给出一个矩阵,由大写字母覆盖,判断同一个大写字母能不能走成一个圈。

思路分析:

注意题意是走成一个圈,而不是矩形,一开始在这耽误了好长时间,而要求走成一个圈,即从这个点开始,沿着上下左右方向走能否最终走回这个点,用dfs,限制条件就是这条路径的颜色必须相同。而最小的圈其实就是走成一个2*2的矩形,那么最少的步数也就是4,那么判断是否回到原点,也就是当前点的坐标等于原点坐标的同时,所走的步数一定是大于等于4的。

代码实现:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[55][55],visit[55][55];
int step,flag;
char ans;
int xx,yy,n,m;
int d[4][2]={-1,0,1,0,0,-1,0,1};

void f(int x,int y){
    if(x==xx&&y==yy&&step>=4){
        flag=1;
        return;
    }
    if(flag==1) return;
    if(x<0||x>n-1||y<0||y>m-1) return;
    if(str[x][y]!=ans||visit[x][y]==1) return;
    visit[x][y]=1;
    for(int i=0;i<4;i++){
        step++;//由当前的点走到下一个点,步数加1;
        f(x+d[i][0],y+d[i][1]);
        step--;//这个方向失败了,步数退回一步,从当前点的另一个方向重新出发
    }
    visit[x][y]=0;//这个点的四个方向都失败,退回到上一个点,
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++)
            scanf("%s",&str[i]);
        flag=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                memset(visit,0,sizeof(visit));
                if(flag==1) break;
                ans=str[i][j];
                step=0;
                xx=i,yy=j;
                f(i,j);
            }
        }
        if(flag) printf("Yes\n");
        else  printf("No\n");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值