八数码

记忆化搜索的一个简单问题,第一次写博客,不怎么会写,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变成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);
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值