//附送楼主一个走法输出的代码
#include<stdio.h>
#include<stack>
#include<windows.h>
using namespace std;
stack<int>Minimum;stack<int>active;
int L,S,T,M,total;/*total记录踩到的石子数*/
int last;//最后一个石子位置
int*stone;//数组以0和1判断有石子和无石子
int min;
void Calculate(int pos)//pos传入青蛙当前的位置
{
int i;
if(pos>last)
{
if(total<min)
{
min=total;
Minimum=active;return;
}
}
for(i=S;i<=T;i++)
{
if(i+pos>L-1)
{
if(total<min)
{
min=total;
Minimum=active;
}
return;
}
if(stone[pos+i])
total++;
active.push(pos+i);
Calculate(pos+i);
active.pop();
if(stone[pos+i])
total--;//复原
}
}
void Destack()
{
HANDLE h;
int data;
if(!Minimum.empty())
{
data=Minimum.top();
Minimum.pop();
Destack();
if(stone[data])
{
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(h,FOREGROUND_RED);
printf("%d,",data);
SetConsoleTextAttribute(h,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN);
}
else
printf("%d,",data);
}
}
int main()
{
int i,tmp_stone;
scanf("%d",&L);
stone=(int*)malloc(L*sizeof(int));
memset(stone,0,L*sizeof(int));
scanf("%d %d %d",&S,&T,&M);
for(i=0;i<M;i++)
{
scanf("%d",&tmp_stone);
stone[last=tmp_stone]=1;//标出数组中的石子
}
printf("石头位置(第一个元素为起点):\n");
for(i=0;i<L;i++)
{
printf("%d,",stone[i]);
}
total=0;min=M;//初始化
Calculate(0);
printf("踩到石头数:%d\n",min);
printf("走法:\n");
Destack();
return 0;
}