描述

有1、2、3、4、5、6、7这7个数字依次全部入栈后再出栈,在入栈的过程中栈中的数据也可以随时出栈,一直到整个栈为空。将出栈得到的数字依次排列,就可以得到一个“合法”的序列;对应的,有些形式字的排列是无论如何调整入栈和出栈顺序也无法得到的,被称为“非法”序列。

比如:“1 2 3 4 6 7 5” 和“1 2 5 6 4 3 7”都是合法的序列,而“1 2 5 7 3 4 6”和“1 2 6 3 4 5 7”以及“1 2 6 3 5 4 7”都是非法的序列。

请编写程序,判断给定的由7个数字组成的序列是合法的还是非法的,如果是合法的输出“Y”,否则输出“N”。


格式

输入格式

第1行是一个整数n,表示要判断的序列的数目。
从第2行到第n+1行,每行一个序列,由1~7组成

输出格式

输出为一行,一个由“Y”和“N”组成的长度为n的字符串,中间不要空格

样例

输入样例

5
1 2 6 3 5 7 4
1 2 6 5 3 7 4
1 2 7 4 5 6 3
1 2 7 6 3 4 5
1 3 2 4 5 7 6

输出样例

NNNNY


限制

时间限制:100 ms
内存限制:16384 KB


代码

  1. //判断依据:出栈序列中,元素i之后所有比i小的元素间必须是降序排列的。
  2. #include<stdio.h>
  3. #define Size 7
  4. int main()
  5. {
  6. int n;
  7. scanf("%d", &n);
  8. int cur[100][Size];//二位数组前部分标记测试样例数,后部分表示每个样例中的数序号
  9. int x;
  10. //赋值
  11. for (x = 1; x <= n; x++)
  12. {
  13. int y;
  14. for (y = 0; y < Size; y++)
  15. {
  16. scanf("%d", &(cur[x][y]));
  17. }
  18. }
  19. int i, j, k, t, q;
  20. int temp, flag1, flag2;
  21. q = 1;
  22. a:
  23. while( q <= n)
  24. {
  25. for (j = 0; j < Size; j++)
  26. {
  27. flag1 = 0;
  28. flag2 = 0;
  29. for (k = j + 1; k < Size; k++) //寻找s[i]之后第一个比s[i]小的 (!!!!!)
  30. {
  31. if (cur[q][k] < cur[q][j])//s[i]之后存在比s[i]小的
  32. {
  33. temp = cur[q][k];//s[j]是s[i]之后第一个比s[i]小的
  34. flag1 = 1;
  35. break;
  36. }
  37. }
  38. if (flag1 == 1)
  39. {
  40. for (t = k + 1; t < Size; t++)
  41. {
  42. if (cur[q][t] < cur[q][j])//s[j]之后如果还有比s[i]小的数
  43. {
  44. if (cur[q][t] < temp)//都必须小于它之前的一个比s[i]小的数
  45. {
  46. temp = cur[q][t];//并更新temp
  47. }
  48. else//否则,出栈序列非法
  49. {
  50. flag2 = 1;
  51. break;//退出至(!!!!!)循环
  52. }
  53. }
  54. }
  55. }
  56. if (flag2 == 1)//接着退出循环
  57. {
  58. break;
  59. }
  60. }
  61. if (flag2 == 1)
  62. {
  63. printf("N");
  64. if (q!= n)
  65. {
  66. q++;
  67. goto a;
  68. }
  69. }
  70. else
  71. {
  72. printf("Y");
  73. if (q != n)
  74. {
  75. q++;
  76. goto a;
  77. }
  78. }
  79. q++;
  80. }
  81. printf("\n");
  82. return 0;
  83. }