BFS:广度优先搜索
一般思路:
通常用队列(先进先出,FIFO)实现
初始化队列Q;
Q = {起点s};
标记s为已访问;
while(Q非空){
取Q队首元素u;
u出队;
if(u==目标状态){
……
}
else{
所有与u相邻且未被访问的点进入队列;
标记u为已访问;
}
}
#include<iostream>
#include<string.h>
using namespace std;
int n,m;
char mp[110][110];
int dx[]={-1,0,1,0,-1,1,-1,1},dy[]={0,1,0,-1,-1,1,1,-1};
bool check(int i,int j){
if(mp[i-1][j]=='*')
if(mp[i-1][j-1]=='*'||mp[i-1][j+1]=='*'||mp[i][j-1]=='*'||mp[i][j+1]=='*')
return true;
if(mp[i+1][j]=='*')
if(mp[i+1][j-1]=='*'||mp[i+1][j+1]=='*'||mp[i][j-1]=='*'||mp[i][j+1]=='*')
return true;
if(mp[i][j+1]=='*')
if(mp[i+1][j]=='*'||mp[i+1][j+1]=='*'||mp[i-1][j]=='*'||mp[i-1][j+1]=='*')
return true;
if(mp[i][j-1]=='*')
if(mp[i-1][j-1]=='*'||mp[i-1][j]=='*'||mp[i+1][j-1]=='*'||mp[i+1][j]=='*')
return true;
return false;
}
void solve(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(mp[i][j]=='*'){
int cnt=1;
for(int k=0;k<=7;k++){
int a=dx[k]+i,b=dy[k]+j;
if(mp[a][b]=='*')cnt++;
}
if(cnt==3&&check(i,j))continue;
else{
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(mp,'.',sizeof(mp));
scanf("%d%d",&n,&m);//n行m列
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
solve();
}
return 0;
}