64,281
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> vec_his;
bool isInHis(int a12,int b8,int b5)
{
for(int i=0;i<vec_his.size();i+=3)
if((vec_his[i]==a12)&&(vec_his[i+1]==b8))
return true;
return false;
}
bool working(int a,int b,int c)
{
if(a==6&&b==6)
{
for(int i=0;i<vec_his.size();i+=3)
{
printf("%4d%4d%4d\n",vec_his[i],vec_his[i+1],vec_his[i+2]);
}
return true;
}
else
{
if((a==6&&b!=6)||(a!=6&&b==6))
{
vec_his.push_back(6);
vec_his.push_back(6);
vec_his.push_back(0);
working(6,6,0);
return true;
}
int newA,newB,newC;
bool bTrue;
if(a>0&&b<8)
{
newC = c;
newA = a-(8-b);
if(newA<0)
{
newA = 0;
newB = b+a;
}
else
{
newB = 12-newA-newC;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=8);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
if(a>0&&c<5)
{
newB = b;
newA = a-(5-c);
if(newA<0)
{
newA = 0;
newC = c+a;
}
else
{
newC = 12-newA-newB;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=8);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
if(b>0&&a<12)
{
newC = c;
newB = b-(12-a);
if(newB<0)
{
newB = 0;
newA = a+b;
}
else
{
newA = 12 - newB - newC ;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=8);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
if(b>0&&c<5)
{
newA = a;
newB = b-(5-c);
if(newB<0)
{
newB = 0;
newC = c+b;
}
else
{
newC = 12 - newB - newA ;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=8);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
if(c>0&&a<12)
{
newB = b;
newC = c-(12-a);
if(newC<0)
{
newC = 0;
newA = a+c;
}
else
{
newA = 12 - newB - newC ;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=8);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
if(c>0&&b<8)
{
newA = a;
newC = c-(8-b);
if(newB<0)
{
newC = 0;
newB = b+c;
}
else
{
newB = 12 - newA - newC ;
}
bTrue = (newA>=0&&newA<=12)&&(newB>=0&&newB<=8)&&(newC>=0&&newC<=5);
if(bTrue&&(isInHis(newA,newB,newC)==false))
{
vec_his.push_back(newA);
vec_his.push_back(newB);
vec_his.push_back(newC);
if(working(newA,newB,newC)==true)
return true;
else
{
vec_his.pop_back();
vec_his.pop_back();
vec_his.pop_back();
}
}
}
return false;
}
}
int main()
{
vec_his.push_back(12);
vec_his.push_back(0);
vec_his.push_back(0);
working(12,0,0);
return 0;
}
if(c>0&&b<8)
递归思想就是分治,把一个大的东西,分成若干小的单元,而每个小的但单元又可以看作是一个大的东西,可以分成若干小的单元,如此下雨,到最后成了不可分割的部分,然后处理之