图2(矩环问题)

问题描述

小鑫的女朋友被魔王抢走了!魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?

输入

多组输入。每组的第一行有两个整数n,m。代表表的大小。接下来是由A-Z的一些字母所构成的n行m列的表。1<=n,m<=200

输出

如果可以救回他的女朋友,输出Yes,否则输出No

样例输入

4 7

ABCBBAA

BCBCBCB

AABBCCA

ACCCBBB

10 3

AAC

ABB

BBA

AAC

CBC

CCA

CBB

CCA

CCB

BAA

样例输出

No

Yes

#include"iostream"
using namespace std;
char map[201][201];        //
bool v[201][201];        //记录是否遍历过
int w,h;                //图的宽高
int pos[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};        //四个方向
int dir1[4] = {1,0,3,2};        //相反方向
bool flag;                //标记

void create(){
    for(int i = 0;i < h;i++){
        for(int j = 0;j < w;j++){
            cin>>map[i][j];
        }
    }
}
void dfs(int y,int x,char c,int dir){        //上下左右:0,1,2,3
    if(v[y][x]){
        flag = true;
    }
    if(map[y][x] == c){
            map[y][x] = '0';
            v[y][x] = 1;
        for(int i = 0;i < 4;i++){
            if(pos[i][0] + y >= 0 && pos[i][0] + y < h && pos[i][1] + x >= 0 && pos[i][1] + x < w && dir1[i] != dir)    //没越界且没反向
                dfs(pos[i][0] + y,pos[i][1] + x,c,i);
        }
    }
    v[y][x] = false;
}
int main(){
    memset(v,0,sizeof(v));
    while(cin>>h>>w && h && w){
        flag = false;
        create();
        for(int i = 0;i < h;i++){
            for(int j = 0;j < w;j++){
                if(map[i][j] != '0'){
                    dfs(i,j,map[i][j],3);
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

 

posted @ 2018-05-13 17:48  oleolema  阅读(154)  评论(0编辑  收藏  举报