读完书中的代码,感觉真是设计的巧妙,于是赶紧写下
#include<stdio.h>
int mat[8][8] = { //存储的是图,其中1代表着黑格,0代表着白格,为了省略越界的检查,整整多
//加了一圈的0
{0,0,0,0,0,0,0,0},
{0,1,0,0,1,0,0,0},
{0,0,0,1,0,1,0,0},
{0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0},
{0,1,1,1,0,0,0,0},
{0,0,1,0,1,0,0,0},
{0,0,0,0,0,0,0,0}
};
void dfs(int i, int j);
int count = 0;
int vis[8][8]; //用于存储那个方格别访问过
int main(){
for (int i=1; i<7;i++){//注意这里只可以是小于7 ,他同时从1开始
for (int j=1; j<7; j++){
if (mat[i][j] && !vis[i][j]){
count++;
dfs(i,j);
}
}
}
printf("%d",count);
}
void dfs(int i, int j){ //这是一个递归函数,递归的检查黑格周围的方格是不是黑色的
if (!mat[i][j] || vis[i][j]){
//既然是递归函数当然首先要写出口条件
//当目前访问的格子是白格,或者这个格子已经被访问过那我们就结束函数
return;
}
vis[i][j] = 1;
//我感觉书中代码这样的格式阻止非常的好,应为清楚的让我们看到对那几个位置的
//格子进行递归
dfs(i-1,j-1); dfs(i-1,j); dfs(i-1,j+1);
dfs(i,j-1); dfs(i,j+1);
dfs(i+1,j-1); dfs(i+1,j); dfs(i+1,j+1);
}