JZOJ 4824. 【NOIP2016提高A组集训第1场10.29】配对游戏

Problem

Description

流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的。棋盘起初全部被动物或障碍物占满了。在一个方格中,‘X’表示一个障碍物,一个‘0’~‘9’的个位数字表示一个不同种类的动物,相同的个位数字表示相同种类的动物。一对动物只有当它们属于同一种类时才可以被消去。消去之后,他们所占的方格就成为空方格,直到游戏结束。要消去一对动物的前提条件是:这对候选动物所在的方格必须相邻,或它们之间存在一条通路。棋盘上一个方格只和其上下左右的方格相邻。一条通路是由一串相邻的空方格组成。路的长度则是通路中空方格的数目。你要输出可被消去的动物的最多对数,以及在此操作过程中,最小的通路长度总和。
例1 如下的一个3*4棋盘:
这里写图片描述
两个种类为“1”的动物可以被消去,因为它们相邻,通路的长度是0。在这一步骤之后,存在一条在两个种类为“0”的动物间的长度为2的通路,所以这两个动物也可以被消去。要消去这2对动物,通路的长度总和是 0+2=2。这也是最小的通路长度总和,因为这是唯一一个消去这2对动物的方法。所以答案是 2 2。
例2 如下的一个4*1棋盘:
这里写图片描述
如果我们先消去正中间的两个种类为“9”的动物,然后消去最上面和最下面的两个种类为“9”的动物,则累计通路长度为 0+2=2。但是,我们可以先消去最顶上的两个,然后再消去最底下的两个。同样也消去了2对动物,但通路长度总和是 0+0=0。很明显,长为0的通路长度总和是最短的,答案应是 2 0。

Input

输入文件第一行包含二个整数 m和n,中间用一个空格隔开,其中1<=m,n<=5。接下来的m行,每一行有n个字符,每个字符是’X’,’0’,’1’,…,’9’其中的一个。相邻两个字符间没有空格。

Output

输出文件仅有一行包含两个整数,中间用一个空格隔开。第一个整数是可被消去的动物的最多对数。第二个整数是消去这些动物对的过程中,最小的通路长度总和。

Sample Input

3 4
XX0X
X11X
X0XX

Sample Output

2 2

Data Constraint

N,M<=5

Solution


每一次找到很多点,然后将他们记到相应数字的桶内。
然后开始DFS,枚举同数字的两个点,然后判断他们是否能互相到达,然后这两个点的合法的最短距离是多少,一直DFS下去。
其他什么剪枝的自己想。

Code

如下代码是dfs的主要过程。

void dg(int x,int y)//这个dfs先预处理。
{
    int i,xx,yy;
    1.记录是哪个数字,并将坐标放到相应的桶内。
    2.分别往4个方向搜,搜到不能再搜为止(转1)。
}
void dfs(int C,int D)
{
    相应的更新答案与剪枝。
    int s,i,j;
    fo(s,0,9) if (num[s])
    {
        fo(i,1,num[s]-1)
            if (a[X[s][i]][Y[s][i]]!=10)//枚举起点和终点
                fo(j,i+1,num[s])
                    if (a[X[s][j]][Y[s][j]]!=10 && i!=j)
                    {
                        memset(c,127,sizeof(c));
                        M=2147483647;
                        枚举是否能到达,并求出最短步数。(再开一个DFS)
                        if (M!=2147483647) 回溯
                    }
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值