人工智能第一章课后习题
要求:四个同心圆盘的扇区数字如图所示,每个圆盘可单独转动。问如何转动圆盘使得八个径向的4个数字和均为12。
/* 同心圆盘问题 */
#include <iostream>
#include <cstring>
#include <deque>
using namespace std;
typedef deque<int> Queue;
void init(Queue &a1, Queue &a2, Queue &a3, Queue &a4);
bool is_ok(Queue a1, Queue a2, Queue a3, Queue a4);
void print(int x[]);
bool change(int x[], Queue a1, Queue a2, Queue a3, Queue a4);
void debug(Queue a1, Queue a2, Queue a3, Queue a4);
int main()
{
Queue a1, a2, a3, a4;
init(a1, a2, a3, a4);
int N = 8*8*8*8;
int s[5];
for(int i = 0; i < N; ++i)
{
memset(s, 0, sizeof(s));
int n = i;
int m = 0;
while (n != 0)
{
int c = n % 8;
n = n / 8;
s[m++] = c;
}
/*
for(int j = 0; j < 4; ++j)
cout << s[j];
cout << endl;
*/
bool ok = change(s, a1, a2, a3, a4);
// debug(a1, a2, a3, a4);
if(ok == true)
{
cout << "方案:" << endl;
print(s);
cout << "---------------------" << endl;
}
}
return 0;
}
void init(Queue &a1, Queue &a2, Queue &a3, Queue &a4)
{
a1 = {1,5,2,2,3,4,3,5};
a2 = {4,3,1,2,2,5,3,5};
a3 = {1,2,3,1,5,2,4,3};
a4 = {4,3,2,3,5,4,3,1};
}
bool is_ok(Queue a1, Queue a2, Queue a3, Queue a4)
{
// debug(a1, a2, a3, a4);
for(int i = 0; i < 8; ++i)
{
int temp = a1[i]+a2[i]+a3[i]+a4[i];
// cout << temp << endl;
if(temp != 12)
return false;
}
return true;
}
void print(int x[])
{
for(int i = 0; i < 4; ++i)
{
cout << "第" << i << "层逆时针转动" << x[i]*45 << "度。" << endl;
}
}
bool change(int x[], Queue a1, Queue a2, Queue a3, Queue a4)
{
int l1 = x[0];
int l2 = x[1];
int l3 = x[2];
int l4 = x[3];
while(l1)
{
a1.push_back(a1[0]);
a1.pop_front();
l1--;
}
while(l2)
{
a2.push_back(a2[0]);
a2.pop_front();
l2--;
}
while(l3)
{
a3.push_back(a3[0]);
a3.pop_front();
l3--;
}
while(l4)
{
a4.push_back(a4[0]);
a4.pop_front();
l4--;
}
// debug(a1, a2, a3, a4);
if(is_ok(a1, a2, a3, a4))
{
return true;
}
return false;
}
void debug(Queue a1, Queue a2, Queue a3, Queue a4)
{
for (int i = 0; i < 8; ++i)
{
cout << a1[i] << a2[i] << a3[i] << a4[i] << endl;
}
cout << "-------------------" << endl;
}