5-12 罗密欧与朱丽叶的迷宫问题
注意:还可加入无解时的剪枝判断
5-16 无优先级运算问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int NM=25;
int a[NM],vis[NM],save[NM],f[NM],k,n,m;
char sf[4]={‘+‘,‘-‘,‘*‘,‘/‘};
bool flag;
bool Backtrack(int t,int res)
{
int i,j;
if(res==m) {
flag=true;
for(i=1;i<t;i++) {
cout<<save[i];
if(i<t-1) cout<<sf[f[i]];
}
cout<<endl;
return true;
}
if(t>k) {
return false;
}
for(j=0;j<n;j++)
{
if(t==1) {
vis[j]=1;save[t]=a[j];
Backtrack(t+1,a[j]);
if(flag) return true;
vis[j]=0;save[t]=0;
}
else //
if(!vis[j]){
vis[j]=1;save[t]=a[j];
for(i=0;i<4;i++){
f[t-1]=i;
if(i==0) Backtrack(t+1,res+a[j]);
else if(i==1) Backtrack(t+1,res-a[j]);
else if(i==2) Backtrack(t+1,res*a[j]);
else {
if(res%a[j]==0) Backtrack(t+1,res/a[j]);
}
if(flag) return true;
}
vis[j]=0;save[t]=0;
}
}
return false;
}
void compute()
{
int mmaxk=25;
memset(vis,0,sizeof(vis));
k=2;
while(!Backtrack(1,0)){
memset(vis,0,sizeof(vis));
if(k>mmaxk) break;
k++;
}
}
int main()
{
int i;
while(cin>>n)
{
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
cin>>m;
flag=false;
compute();
if(!flag) cout<<"No solution!"<<endl;
}
return 0;
}
/*
10 111
1 6 7 7 8 9 44 33 55 66
4 5
1 3 1 2
2 5
1 6
*/原文:http://blog.csdn.net/killua_99/article/details/21894703