简单回溯,小心输入输出格式.
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <memory.h>
using namespace std;
#define MAX 40
char buf[MAX];
char npName[MAX][MAX];
int curSize,n;//当前要显示的子集大小
vector<int>stak;
void backtracking(int curi){
if(curSize==stak.size()){
for (int i=0;i<stak.size();++i)
{
if(i>0)printf(", ");
printf("%s",npName[stak[i]]);
}
printf("\n");
return;
}else if(curi>=n)return;
stak.push_back(curi);
backtracking(curi+1);
stak.pop_back();
backtracking(curi+1);
}
int main(){
int t;
scanf("%d\n\n",&t);
while (t--)
{
int r1=-1,r2=-1;
n=0;
curSize=0;
gets(buf);
if(buf[0]=='*'){
curSize=-1;
}else{
sscanf(buf,"%d %d",&r1,&r2);
if(r2==-1)r2=r1;
}
//读入数据
while (gets(npName[n])&&strcmp(npName[n],""))n++;
if(curSize==-1){
//所有的大小
r1=1,r2=n;
}
for (int i=r1;i<=r2;++i)
{
curSize=i;
printf("Size %d\n",curSize);
backtracking(0);
printf("\n");
}
if(t)printf("\n");
}
return 0;
}

本文探讨了回溯算法的基本概念及其在处理输入输出问题时的策略与技巧,通过实例展示了如何有效利用回溯算法解决实际问题。

458

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



