八数码

来源:互联网 发布:什么是多功能机软件 编辑:程序博客网 时间:2024/04/29 07:23

记忆化搜索的一个简单问题,第一次写博客,不怎么会写,so,上代码先,有注释。希望自己以后能看懂。

问题描述:

Description

输入一个n*n(n最大为30)的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者有公共顶点,就说它们属于同一个八连块。
如下图所示,八连块的个数为3。
100100
001010
000000
110000
111000
010100

Input

第一行输入一个n 表示图的大小
接下来n行 用来表示图的组成

Output

输出八连块的个数

Sample Input

6
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变成0for(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);}}

原创粉丝点击