UVa 10152 ShellSort

UVa 10152 ShellSort
代码第23行本意是r[j]=i,不小心写成了r[i]=j,输出一个序列,找到了规律:从后向前找升序的第一个值,把它及其它之前的全部输出……
比如对于第二个样例得到1,6,3,2,4,5,7,8,9。从后向前第一个升序是3,所以输出3,6,1。
以下是我的代码(囧):
 1  #include  < iostream >
 2  #include  < string >
 3  #include  < cstdio >
 4  using   namespace  std;
 5 
 6  const   int  kMaxn  =   1007 ;
 7 
 8  int  n, r[kMaxn];
 9  string  init[kMaxn], aim[kMaxn];
10 
11  void  Input ()
12  {
13      scanf (  " %d " & n );
14      getchar();
15       for  (  int  i  =   1 ; i  <=  n; i ++  )
16          getline ( cin, init[i] );
17       for  (  int  i  =   1 ; i  <=  n; i ++  )
18      {
19          getline ( cin, aim[i] );
20           for  (  int  j  =   1 ; j  <=  n; j ++  )
21               if  ( aim[i]  ==  init[j] )
22              {
23                  r[i]  =  j;
24                   break ;
25              }
26      }
27       for  (  int  i  =   1 ; i  <=  n; i ++  )
28          printf (  " %d  " , r[i] );
29      puts (  ""  );
30  }
31 
32  void  Solve ()
33  {
34       int  pos  =   - 1 ;
35       for  (  int  i  =  n; i  >=   2 ; i --  )
36           if  ( r[i - 1 >  r[i] )
37          {
38              pos  =  i - 1 ;
39               break ;
40          }
41       if  ( pos  !=   - 1 )
42      {
43           for  (  int  i  =  pos; i  >=   1 ; i --  )
44              printf (  " %s\n " , aim[i].c_str() );
45      }
46  }
47 
48  int  main ()
49  {
50  #ifndef ONLINE_JUDGE
51      freopen (  " data.in " " r " , stdin );
52  #endif
53      
54       int  T;
55      scanf (  " %d " & T );
56       while  ( T --  )
57      {
58          Input ();
59          
60          Solve ();
61          
62          printf (  " \n "  );
63      }
64      
65       return   0 ;
66  }
67 

你可能感兴趣的:(UVa 10152 ShellSort)