做了这道题目,才让我回味起了acm最初始的快乐,那就是将一个事物的本质想清楚了之后,能很清晰的看清楚。。。
稍微说一下解这道题目的解题思路吧。。
现在我们有n个盘子,然后我们想把这些盘子从A上面移到C盘上去,那么第n个盘子应该是最后一次的移动,所以第n个盘子只可能出现在A和C盘上,OK。。那么如果现在你知道了第n个盘子在哪里,能不能确定n-1个盘子不能出现在哪个盘子。
View Code
1 #include<iostream> 2 using namespace std; 3 int num[3][65],head[3]; 4 int judge(int a,int b,int c,int n) 5 { 6 7 if(num[b][head[b]]==n)return false; 8 else 9 { 10 if(num[a][head[a]]==n) //若现在这个盘子在A柱子上面,那么就可以确定,现在我们的任务是将A上n-1个盘子移到B盘上面去,那么此时我们就可以把B盘当做C盘,因为第n个盘子合法了,我们可以不去管他了。。 11 { 12 if(n==1)return true; 13 head[a]++; 14 return judge(a,c,b,n-1); 15 } 16 else 17 if(num[c][head[c]]==n) 18 { 19 if(n==1)return true; 20 head[c]++; 21 return judge(b,a,c,n-1); 22 } 23 } 24 } 25 int main() 26 { 27 int t,n; 28 scanf("%d",&t); 29 while(t--) 30 { 31 scanf("%d",&n); 32 for(int i=0;i<3;i++) 33 { 34 scanf("%d",&num[i][0]); 35 for(int j=1;j<=num[i][0];j++) 36 { 37 scanf("%d",&num[i][j]); 38 } 39 } 40 int k; 41 head[0]=head[1]=head[2]=1; 42 if(judge(0,1,2,n))printf("true\n"); 43 else 44 printf("false\n"); 45 } 46 }