判断某种状态是否是正确的。
首先判断盘中是否在A柱或者C柱上,在,则说明是正确的。
然后判断第N个,是否在A上,在,则A上的准备移到B上,继续递归判断N-1块是否符合,在C上,则说明B上的准备借助A移到C,在B上,则说明是错误的。
这样递归调用。
#include <iostream>
#include <cstring>
using namespace std;
int hanio(int n, int *a, int *b, int *c, int x, int y, int z)
{
int i;
if(!n)
return 1;
for(i = 0; i < y; i++)
if(b[i] == n)
return 0;
for(i = 0; i < x; i++)
{
if(a[i] == n)
return hanio(n - 1, a, c, b, x, z, y);
}
for(i = 0; i < z; i++)
{
if(c[i] == n)
return hanio(n - 1, b, a, c, y, x, z);
}
return 0;
}
int main()
{
int i, t, n, a, b, c;
int A[100], B[100], C[100];
cin >> t;
while(t--)
{
cin >> n;
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(C, 0, sizeof(C));
cin >> a;
for(i = 0; i < a; i++)
cin >> A[i];
cin >> b;
for(i = 0; i < b; i++)
cin >> B[i];
cin >> c;
for(i = 0; i < c; i++)
cin >> C[i];
if(a == n || c == n)
cout << "true" << endl;
else
{
if(hanio(n, A, B, C, a, b, c))
cout << "true" << endl;
else
cout << "false" << endl;
}
}
return 0;
}