思路分析:
在一个数组一遍扫描,找这个数组里面与item值相同的数组元素,如果找到不能直接让后面的向前覆盖,因为考虑到有可能后面也有和item相同的元素,所以,先将不同的元素向前覆盖,如果找到相同的需要再次执行这个函数,在这里就产生了递归。值得注意的是:当最后一个相等元素找到之后就要像回溯,但是还需要做一个处理。
举例分析
6123145
在1元素的位置进入了递归
要将数组改成
6233145,这个时候,将23元素完成了覆盖,但是在1的位置没有覆盖,当45完事之后,变成了如下情况:
6233455,这个时候细心的观众就会发现,应该是623455,多出了一个3,这个是覆盖的时候所剩的冗余,也是1的位置没办法向前覆盖的原因。
所以增加的操作就是一次递归完成之后,要向前再覆盖一次;
需要注意如果第一个位置就是item则不用覆盖。
还要注意向前覆盖的位点是j,而不是i和s(在代码中体现)
删除之后结果:
数组元素为len(a)-item的数量
并且各元素保持着在原数组中的位置
#include <stdio.h>
#include <stdlib.h>
void dfs(int *a,int s,int item)
{
int flag=0;
for(int i=s;i<9;i++)
{
if(a[i]==item)
{
for(int j=i+1;j<9;j++)
{
if(a[j]!=item)
{
a[j-1]=a[j];
}
else
{
dfs(a,j,item);
flag=1;
if(j!=0)//递归出口判断错误,这块是在i循环下找到的j,而我们想利用的值是j
for(int u=j-1;u<9;u++)
{
a[u-1]=a[u];
}
}
if(flag==1)
break;
}
}
if(flag==1)
break;
}
return;
}
int main()
{
int a[9]={1,2,1,2,3,2,1,3,2};
dfs(a,0,1);
for(int i=0;i<9;i++)
printf("%d ",a[i]);
}