/*
给出一个仅由-1,+1两种基本符号的8位符号串,设计程序:找出所有能两两相乘,内积为零的符号串。
例:
给出:
Z(+1 -1 +1 -1 -1 -1 +1 +1)
有:A(-1 +1 -1 +1 -1 -1 +1 +1)
B(+1 -1 -1 +1 +1 +1 +1 +1)
其中Z A B 相互的内积为零。
*/
#include <iostream>
#include <deque>
#include <algorithm>
#include <iterator>
using namespace std;
typedef deque< int > symbol_string;
typedef deque< symbol_string > string_set;
typedef string_set::iterator ss_iter;
void init(string_set& r);
void print_string(const string& which, const symbol_string& ss);
struct if_remove
{
if_remove(const symbol_string& ss)
: aim(ss)
{
}
if_remove(const if_remove& ir)
: aim(ir.aim)
{
}
bool operator()(const symbol_string& ss)
{
int sum = 0;
for (int i = 0; i < 8; ++i)
{
sum += ss[i]*aim[i];
}
if (sum == 0)
{
return false;
}
return true;
}
private:
symbol_string aim;
};
int main()
{
static int _Z[8] = {1, 1, 1, 1, 1, 1, 1, 1};
symbol_string Z(&_Z[0], &_Z[8]);
string_set range;
init(range);
string_set ar = range;
ar.erase(remove_if(ar.begin(), ar.end(), if_remove(Z)), ar.end());
string_set br = ar;
for (ss_iter i = ar.begin(); i != ar.end(); ++i)
{
br.erase(remove_if(br.begin(), br.end(), if_remove(*i)), br.end());
for (ss_iter j = br.begin(); j != br.end(); ++j)
{
print_string("Z", Z);
print_string("A", *i);
print_string("B", *j);
cout << endl;
}
}
}
void init(string_set& r)
{
symbol_string ss;
for (int i = 0; i < 256; ++i)
{
int temp = i;
ss.clear();
for (int j = 0; j < 8; ++j)
{
if (temp % 2 == 0)
{
ss.push_front(-1);
}
else
{
ss.push_front(1);
}
temp >>= 1;
}
r.push_back(ss);
}
}
void print_string(const string& which, const symbol_string& ss)
{
cout << which << ": ";
copy(ss.begin(), ss.end(), ostream_iterator< int >(cout, "/t"));
cout << endl;
}