思路:使用回溯法。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[21][21]={0};
int visited[21][21]={0};
int func(char* str,int i,int j,int row,int column){
if(str[1]=='\0')
return 1;
//向上
if( i>0 && str[1]==a[i-1][j] && !visited[i-1][j] ){
visited[i-1][j]=1;
if( func(str+1,i-1,j,row,column) )
return 1;
visited[i-1][j]=0;
}
//向下
if( i<row-1 && str[1]==a[i+1][j] && !visited[i+1][j] ){
visited[i+1][j]=1;
if( func(str+1,i+1,j,row,column ))
return 1;
visited[i+1][j]=0;
}
//向左
if( j>0 && str[1]==a[i][j-1] && !visited[i][j-1] ){
visited[i][j-1]=1;
if( func(str+1,i,j-1,row,column ))
return 1;
visited[i][j-1]=0;
}
//向右
if( j<column-1 && str[1]==a[i][j+1] && !visited[i][j+1] ){
visited[i][j+1]=1;
if( func(str+1,i,j+1,row,column ))
return 1;
visited[i][j+1]=0;
}
return 0;
}
int main(){
int i,j;
int row;
int column;
char str[100];
scanf("%d%d",&row,&column);
scanf("%s",&str);
char c;
scanf("%c",&c);//吃掉回车
for(i=0;i<row;++i){
for(j=0;j<column;++j)
scanf("%c",&a[i][j]);
scanf("%c",&c);//吃掉每行末尾的回车
}
int flag=0;
for(i=0;i<row;++i){
for(j=0;j<column;++j){
if(a[i][j]==str[0]){
visited[i][j]=1;//注意这里也需要进行记录
if( func(str,i,j,row,column) )
flag=1;
visited[i][j]=0;//记得回溯
}
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
/*
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
5 5
SLRB
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
*/