DFS神秘数列

题目描述

研究中心正在研究一种数列,该数列由整数组成,
每次可以对相邻的两个数进行相减操作,
并删去这两个数,将运算结果替换进去。直到此数列只剩一个数为止。
现在此研究中心欲使此最后剩下的数字为目标数,请你帮助他们完成这个任务。 
若此数列为{12,10,4,3,5},目标数为4,E(n)表示对第n和第n+1数进行相减并替换。 
    E(2)={12,6,3,5}    (6 = 10-4)
    E(3)={12,6,-2}     (-2 = 3-5)
    E(2)={12,8}        (8 = 6-(-2))
    E(1)={4}           (4 = 12-8)
则最后达到目的,数列仅剩一目标数,则此过程为:2,3,2,1

输入

第一行为N (3≤N≤10),为数列中数的个数 。
第二行为M,为目标数 。
以下N行每行一个整数,为此数列中的数。
输出

一个整数,为可行方案的数量。

输入

第一行为N (3≤N≤10),为数列中数的个数 。
第二行为M,为目标数 。
以下N行每行一个整数,为此数列中的数。
输出

一个整数,为可行方案的数量。

思路:用深搜解题。
把深度设为n,从1开始,每两个相邻的数相减并存到前一个数,然后把后面的数全部向前移一位,填充相减的第二个数,然后dep累减。当dep为1时就判断最后减出来的数是否为原来的目标数,如果是就累加,否则直接返回。

#include<bits/stdc++.h>
using namespace std;
const int N=22;
int n,m,ans,a[N][N];
void dfs(int len)
{
	if(len==n)
	{
		ans=a[1][len]==m?ans+1:ans;
		return;
	}
	for(int i=1;i<=n-len;i++)
	{
		int j=1,group=1;
		while(j<=n-len)
		{
			if(group==i)
			{
				a[j++][len+1]=a[i][len]-a[i+1][len];
				group+=2;
			}
			a[j++][len+1]=a[group][len];
			group++;
		}
		dfs(len+1);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i][1];
	dfs(1);
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/qq_43034907/article/details/82890442
dfs
今日推荐