题意:输入一个十字符的字符串,第i个为1代表有质量为i的砝码,经过n次操作,保证每次放的砝码和上次放的质量不一样,且此次一定重于另一端。
#include<iostream>
#include<string.h>
using namespace std;
int n,count;
int a[10];
int data[1000];
bool dfs(int l,int r,int cur,int num)//左边的重量,右边的重量,当前的轮数,前一个填的数
{
data[cur]=num;
if(cur==n)
{
return true;
}
else if(cur%2==0)//是偶数则放左边
{
for(int i=0;i<count;i++)
{
if(a[i]!=num&&l+a[i]>r)
{
if(dfs(l+a[i],r,cur+1,a[i]))
{
return true;
}
}
}
}
else if(cur%2!=0)//是奇数则放右边
{
for(int i=0;i<count;i++)
{
if(a[i]!=num&&r+a[i]>l)
{
if(dfs(l,r+a[i],cur+1,a[i]))
{
return true;
}
}
}
}
return 0;
}
int main()
{
char num[10];
cin>>num;
memset(data,0,sizeof(data));
for(int i=0;i<10;i++)
if(num[i]=='1')
{
a[count++]=i+1;
}
cin>>n;
if(count==0)
{
cout<<"NO"<<endl;
}
else
{
if(dfs(0,0,0,-1))
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
cout<<data[i]<<" ";
}
else
cout<<"NO"<<endl;
}
return 0;
}
本文介绍了一个关于砝码放置的算法问题,通过递归深度优先搜索(DFS)的方法来解决如何在保证一定规则下放置不同重量的砝码。文章详细展示了C++实现的源代码,并解释了核心算法思路。
330

被折叠的 条评论
为什么被折叠?



