nyist 93 汉诺塔(三)
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=93
判断给你的操作是否满足要求:
使用三个栈来操作,模拟该过程
1 #include<stdio.h> 2 #include <string.h> 3 4 #define N 105 5 6 int a[4][N]; 7 int f[N][2]; 8 9 void init(int n)//初始化栈 第一根柱子 10 { 11 memset(a,0,sizeof(a)); 12 13 int i; 14 int t = 1; 15 for(i = n; i >0; i--) 16 a[1][t++] = i; 17 } 18 19 void judge(int n,int m) 20 { 21 int i; 22 int j; 23 int t_a = n; 24 int t_b = 0; 25 int t_c = 0; 26 int flag1 = 1; 27 int flag = 0; 28 for(i =0; i < m; i++) 29 { 30 flag = 0; 31 switch(f[i][0]) 32 { 33 case 1: 34 if(t_a <= 0) 35 { 36 37 flag1 = 0; 38 flag = 1; 39 break; 40 } 41 else 42 { 43 switch(f[i][1]) 44 { 45 case 2: 46 if(a[2][t_b] < a[1][t_a] && a[2][t_b]) 47 { 48 flag = 1; 49 flag1 = 0; 50 break; 51 } 52 else 53 { 54 a[2][++t_b] = a[1][t_a--]; 55 break; 56 } 57 case 3: 58 if(a[3][t_c] < a[1][t_a] && a[3][t_c]) 59 { 60 flag = 1; 61 flag1 = 0; 62 break; 63 } 64 else 65 { 66 a[3][++t_c] = a[1][t_a--]; 67 68 break; 69 } 70 } 71 break; 72 } 73 case 2: 74 if(t_b <= 0) 75 { 76 77 flag = 1; 78 flag1 = 0; 79 break; 80 } 81 else 82 { 83 switch(f[i][1]) 84 { 85 case 1: 86 if(a[1][t_a] < a[2][t_b] && a[1][t_a]) 87 { 88 flag = 1; 89 flag1 = 0; 90 break; 91 } 92 else 93 { 94 a[1][++t_a] = a[2][t_b--]; 95 break; 96 } 97 case 3: 98 if(a[3][t_c] < a[2][t_b] && a[3][t_c]) 99 { 100 flag = 1; 101 flag1 = 0; 102 break; 103 } 104 else 105 { 106 a[3][++t_c] = a[2][t_b--]; 107 break; 108 } 109 } 110 break; 111 } 112 case 3: 113 if(t_c <= 0) 114 { 115 flag = 1; 116 flag1 = 0; 117 break; 118 } 119 else 120 { 121 switch(f[i][1]) 122 { 123 case 1: 124 if(a[1][t_a] < a[3][t_c] && a[1][t_a]) 125 { 126 flag = 1; 127 flag1 = 0; 128 break; 129 } 130 else 131 { 132 a[1][++t_a] = a[3][t_c--]; 133 break; 134 } 135 case 2: 136 if(a[2][t_b] < a[3][t_c] && a[2][t_b]) 137 { 138 flag = 1; 139 flag1 = 0; 140 break; 141 } 142 else 143 { 144 a[2][++t_b] = a[3][t_c--]; 145 break; 146 } 147 } 148 break; 149 } 150 } 151 if(flag) 152 { 153 printf("illegal\n"); 154 break; 155 } 156 } 157 /* 158 for(j = 0; j <= t_a; j++) 159 printf("%d ",a[1][j]); 160 printf("\n"); 161 for(j = 0; j <= t_b; j++) 162 printf("%d ",a[2][j]); 163 printf("\n"); 164 for(j = 0; j <= t_c; j++) 165 printf("%d ",a[3][j]); 166 printf("\n"); 167 */ 168 if(flag1) 169 printf("legal\n"); 170 } 171 int main() 172 { 173 int T; 174 scanf("%d",&T); 175 while(T--) 176 { 177 memset(f,0,sizeof(f)); 178 179 int n,m; 180 scanf("%d%d",&n,&m); 181 init(n); 182 int i; 183 for(i = 0; i < m; i++) 184 scanf("%d%d",&f[i][0],&f[i][1]); 185 judge(n,m); 186 } 187 return 0; 188 }
yy_room