记忆化搜索的一个简单问题,第一次写博客,不怎么会写,so,上代码先,有注释。希望自己以后能看懂。
问题描述:
Description
输入一个n*n(n最大为30)的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者有公共顶点,就说它们属于同一个八连块。
如下图所示,八连块的个数为3。
100100
001010
000000
110000
111000
010100
如下图所示,八连块的个数为3。
100100
001010
000000
110000
111000
010100
Input
第一行输入一个n 表示图的大小
接下来n行 用来表示图的组成
接下来n行 用来表示图的组成
Output
输出八连块的个数
Sample Input
6
100100
001010
000000
110000
111000
010100
100100
001010
000000
110000
111000
010100
Sample Output
3
#include <stdio.h>
int n;
int map[31][31];
int dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//八个方向
void mDfs(int i, int j);//记忆化搜索
int main()
{
int i,j, num = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%1d",&map[i][j]);//读入时注意%1d,此处略坑爹
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(map[i][j] == 1)//遍历时,遇到1,开始记忆化搜索
{
num ++;
mDfs(i,j);
}
}
}
printf("%d\n",num);
return 0;
}
void mDfs(int i, int j)
{
int ti,tj,k;
map[i][j] = 0;//把当前位置的水坑填满,即把1变成0
for(k=0; k<8; k++)//8个方向遍历
{
ti = i + dir[k][0];
tj = j + dir[k][1];
if(ti >= 0 && ti < n && tj >= 0 && tj < n && map[ti][tj] == 1)//不越界的前提下,继续深搜
mDfs(ti,tj);
}
}