TOJ 2921 古韵之鹊桥相会 / 深搜

古韵之鹊桥相会

时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte

描述

迢迢牵牛星,皎皎河汉女。
纤纤擢素手,札札弄机杼;
终日不成章,泣涕零如雨。
河汉清且浅,相去复几许?
盈盈一水间,脉脉不得语。
——《古诗十九首》
传说,上古时期的某个七月七日,王母娘娘为了阻止牛郎织女的爱情,划一道玉钗拆散鸳鸯,使两人“星桥鹊驾,经年才见,想离情、别恨难穷。”于是,“执子之手,与子偕老”成了天下有情人共同的希翼。
在气宇轩昂、玉树临风、才高八斗、英俊潇洒的程文大牛的期盼中,浪漫又迷人的七夕终于来临了。迷离的夜空之上,牛郎织女的絮语伴随着美好的秋光,浸润了古今文人墨客多情的心。他与美若天仙、唇红齿白、蕙质兰心、冰雪聪明的某MM约好在清江的小桥上相会……
天亦有情,此时,浮云错开,从天而降一张丝绸地图:正面上,不同颜色的星星组成了前方道路的俯视图;背面写着“愿有情人终成眷属,无伴者皆得幸福。——瑾姝”。
程文仔细看着这个图,发现自己必须从上到下打通一条道路才能见到某MM,于是程文决定用排云掌和风神腿打开前方的道路——
现用不同的字母来表示不同颜色的星星,连在一起(水平或竖直相邻才算连在一起)的相同颜色的星星,程文可以一次性全部打掉。
图样如下:
AABBCCD
AFFBGGD
IIJBKKD
MNNOOPD
QQRRSST
比如在这张地图中,程文可以先打掉最右边的D区域,然后再打通T区域,这样就只用两次就可以打通道路(道路是可以拐弯的,不一定要是一条直线)。
因为使用排云掌和风神腿会耗费体力,耗费干净了程文就没法陪MM一起玩了,所以程文想用最少的次数来打通这条道路,不过程文现在跑去学Java了,这件事就交给你了。

输入

每组测试数据的第一行有两个整数,m和n(0<m,n<21);
下面m行,每行n个字母。
输入以EOF结束。

输出

每组输出一个整数,程文打通道路用功力的最少的次数。

样例输入

5 7
AABBCCD
AFFBGGD
IIJBKKD
MNNOOPD
QQRRSST

样例输出

2
#include <stdio.h>
char a[25][25];
int map[25][25];
int n,m;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
void dfs(int x,int y,int step)
{
	if(map[x][y] <= step)
		return;
	map[x][y] = step;
	
	int i,xx,yy,s;
	for(i = 0;i < 4; i++)
	{
		xx = x + dir[i][0];
		yy = y + dir[i][1];
		if(xx >= 0 && xx < n && yy >= 0 && yy < m)
		{
			if(a[xx][yy] == a[x][y])
				s = step;
			else
				s = step + 1;
			if(s < map[xx][yy])
				dfs(xx,yy,s);
		}
	}
}
int main()
{
	int i,j;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		for(i = 0; i < n; i++)
		{
			for(j = 0; j < m; j++)
				map[i][j] = 0x7fffffff;
		}
		for(i = 0;i < n; i++)
		{
			scanf("%s",a[i]);
		}
		for(i = 0;i < m; i++)
		{
			dfs(0,i,1);
		}
		int min = 0x7fffffff;
		for(i = 0;i < m; i++)
		{
			if(min > map[n-1][i])
				min = map[n-1][i];
		}
		printf("%d\n",min);
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值