刚开始拿到这道题的时候错误的做法:
1 //相邻之间的数小于等于M
2 //首先弹出来的数小于等于M
3 #include<stdio.h>
4 #include<math.h>
5 #define MAXN = 1000000;
6 int M,N,K;
7 int main(){
8 int pre,now,i,j,flag=0;
9 scanf("%d %d %d",&M,&N,&K);
10 for(i=0;i<K;i++){
11 flag = 0;
12 scanf("%d",&now);
13 if(now>M) flag=1;
14 for(j=1;j<N;j++){
15 pre = now;
16 scanf("%d",&now);
17 if(abs(pre-now)>M) flag=1;
18 }
19 if(flag==1) printf("NO\n");
20 else printf("YES\n");
21 }
22
23 return 0;
24 }
后来发现问题后,重新选择的方法:

1 #include<stdio.h>
2 #define MAXN 10000
3 int M,N,K;
4 int b[MAXN],stack[MAXN],top;
5 int detect();
6 int main(){
7 int p,i,j,flag=0;
8 scanf("%d %d %d",&M,&N,&K);
9 b[0] = N;
10 for(i=0;i<K;i++){
11 for(j=1;j<=N;j++){
12 scanf("%d",&b[j]);
13 }
14 if(detect()==1) printf("YES\n");
15 else printf("NO\n");
16 }
17 return 0;
18 }
19 int detect(){
20 int i,j,value,flag,start;
21 top = 0;
22 stack[top] = b[0];
23 start= 1;
24
25 for(i=1;i<=b[0];i++){
26 value = b[i];
27 flag = 0;
28 for(j=1;j<=top;j++){
29 if(stack[j]==value) flag = 1;
30 }
31 //不在栈中
32 if(flag==0){
33 //前面的元素入栈
34 if(start<=value){
35 for(j=start;j<=value;j++){
36 ++top;
37 if(top>M) return 0;
38 else stack[top] = j;
39 }
40 start = value+1;
41 top--;
42 }
43
44 }
45 //在栈中
46 else{
47 if(stack[top]!=value) return 0;
48 else top--;
49
50 }
51
52 }
53 return 1;
54 }
总结:使用了栈的方法,注意栈的容量问题。
来源:https://www.cnblogs.com/Learn-Excel/p/12610772.html