问题概述:连续P个方块,一共拿走Q个(指定具体哪几个),每次拿走一个(顺序任意),每拿走一个,与其能联通的盒子都返回1,
求拿走Q个后返回总数之和最小的值。
例:输入P=20,Q=3。输入三个数3,6,14。返回35.
我写的代码如下,
#include<iostream>
using namespace std;
static int sum = 0;
void ff(int a[], int, int);
int main(){
int p, q, x;
cin >> p >> q;
int *a = new int[p];
int *b = new int[q];
for (int i = 0; i < p; i++)
a[i] = 0;
for (int i = 0; i < q; i++)
{
cin >> x;
a[x - 1] = 1;
}
ff(a, 0, p - 1);
cout << sum << endl;
return 0;
}
void ff(int a[],int left,int right){
int r = right, l = left;
int n = r - l+1;
int mid = n / 2;
int flag = 0, i = 0, x;
if (l > r)return;
while (mid - i>= l&&mid + i<= r){
if (a[mid + i] == 1)
{
flag = 1;
x = mid + i;
break;
}
if (a[mid - i] == 1)
{
flag = 1;
x = mid - i;
break;
}
i++;
}
if (mid - i == l&&a[mid - i] == 1&&flag==0)
{
flag = 1;
x = mid - i;
}
if (flag == 1)
{
sum += n - 1;
ff(a, left, x - 1); <--(1)
ff(a, x + 1, right); <--(2)
}
else return;
}
如果输入p=5,q=3。在输入1,3,5。
输出应为6。但是却输出了4.
经过单步调试,在(2)式第一次递归调用的时候,传入right为啥是1。应该传入3吧才合适,也就是说(1)式调用两次改变了本该出入(2)式的right……
请问各路大神是这样吗?应该怎么改呢……