2011年12月14日星期三

转一段书评

from 豆瓣《我是一只IT小小鸟》


    一年多前,我到一位朋友家作客,他从学校已经毕业半年有余,没找工作,一直呆在家游手好闲。当时电视正在播电视剧《奋斗》,看了半集我问我朋友,这片子有什么好看么?而我朋友则一面严肃的表情说“你不懂,这片子特励志,不是你这种90后理解得来的”,并表示,等看完这部电视剧以后,自己马上也要开始奋斗;我没想到这种流行电视剧居然有如此“功效”,实在令我有点将信将疑。
 
  一年后,我再次拜访这位朋友,他依旧是无业流民,每天过着:上网-看电视-睡觉,三点一线的生活,还时不时跟我抱怨说,为什么别人刚毕业就有奥迪A6开,老爸一给就是两百万,用的诺基亚8800,都怪我爸妈不努力呀。
 
  我听完,心中满是唏嘘,心想,你要是一年前真的开始努力奋斗,即便现在没有大富大贵,起码也不必落得这斯田地。 

  同样地,适逢计算机专业成为最难就业专业,高校里有不知多少为仕途忧虑、对未来毫无概念的计算机专业学生,然后恰好这本书就出现了(这个时机决定了它必然是一本畅销书),那些迷惘的学生肯定是迫不及待地订购了一本,然后读到书上那些成功的学长学姐们,就如同我那位朋友看了励志电视剧一样——满腔的热血都被激发了,心中暗下目标,将来也要成为一只“小小鸟”,入主google,差一点的也要去个微软研究院什么的。 

  可是当他们实践起来的时候,才发现行动起来是如此的难,少了老师的填鸭,任何事情都变得寸步难移了:什么c/c++、java一点不会(老师还没教会我呢),linux难用得要死(之前我都是用windows的),搭个web服务器居然不能点鼠标来设置(linux的编辑器连鼠标不能用,天哪!)。。。一次次尝试之后,他们开始受挫,几次失败之后,他们放弃了,心想,都怪这本书,害我一时激动白费了那么多努力,维持现状不就够了,拿到文凭不就行了,折腾那么多干嘛? 

  励志形式的题材总会给人一种错觉,就是它们都把未来描绘得太美好了:那些读书的年轻人们,那些单纯而浮躁的年轻人们,一心只想着也给自己创造一个美好的未来,却对得到一个好的结果所要付出的代价和努力知之甚少,甚至充耳不闻。

  很多深陷泥潭的人,他们从来不去思考自身的困境,却满心期待着通过一本两本书、一部两部电视剧,希望从中得到启发,让自己脱胎换骨,那无异是痴人说梦;

  即便你真的能排除思想上的障碍,将计划付诸行动,在过个程中,也有无数这样那样的困难,挡住你前进的道路——这是一个漫长而艰苦的过程,决不是一时意气就能坚持下来的。

  你要做的,不是看几本励志书、重温几部像《奋斗》那样的片子,或者跑到小组上问像“学c++该看什么书“之类的蠢问题,而是应该把你脑子中那点渴望不劳而获的思想赶跑,把你从小到大养成的无须思考、等待答案的填鸭式教育带来的坏习惯改掉,然后,也是最最重要的——开始做实事,这就够了。

  看到满版评论都在为这本书喝彩,看到不少朋友立志成为“小小鸟”,我忽然有种毛骨悚然的感觉,毫不客气的说,我想这里面大部分人(如果不是全部的话)都会精神抖擞而去,垂头丧气而归。

  前几天一个刚大一的朋友问我一道很简单的c语言题目,我告诉他思路,说这道题用bit operator来做,他说不会,让我直接给答案,我希望他自己做出来,就跟他说我也不会你自己做,拉拉扯扯了一个多小时,最后他从网上搜出了一个答案交给老师。

  据他说,他们班上大部分人都是那么干的(每当老师从背后经过的时候总是胆战心惊),我对这群同年人有点失望,觉得学习不应该这样得过且过,随即又明白一个道理:很多时候,我们对别人的选择其实无能为力;

  开个玩笑,假如给我朋友那班的大一新生全部发一本《小小鸟》,他们就会认真对待自己的编程课吗?我想未必,因为他们本身都不愿意努力,我们对他指手划脚、好言相劝,又有什么用呢?


-------------------------------------------------------------------

个人觉得,一样东西的存在,总有它的道理,励志文学也是如此。虽然说执行力确实是另一回事,但起码会给人一个奋斗的目标。有动力,还需要持之以恒。找准方向才是第一要务。多花一点时间,思考一下人生的路,未来的路,未尝不是一件好事。技术无止境,找到真正属于自己的,适合自己的,才会事半功倍。

有时候确实会很迷茫,各种各样的技术与方向,那条才是自己的路。看过各种博客,也经常去请教师兄,始终不得其道。大概有些事,是真的要自己走过才能深有体会吧。

2011年12月10日星期六

POJ 1753 Flip Game 暴力。。。囧


这题跟先前那题基本一样,就不多说了 = =
很郁闷的是一样的题目一样的思路竟然效率还是那么低,总会有这样那样的小问题,然后debug来debug去,我勒个去啊~~~~~~
上网找了一下,用BFS + 位操作。。。。
喵的好高级 = =
队列实现的BFS。。。寒假回去恶补搜索啊囧~~


#include”cstdio”
#include”cstring“
#include”cstdlib“
char table[6][7];
char copy[6][7];
int firstline[5],count;
void change(int a,int b)
{
if(copy[a][b] == 'b')copy[a][b] = 'w';else copy[a][b] = 'b';
if(copy[a-1][b] == 'b')copy[a-1][b] = 'w';else copy[a-1][b] = 'b';
if(copy[a][b-1] == 'b')copy[a][b-1] = 'w';else copy[a][b-1] = 'b';
if(copy[a+1][b] == 'b')copy[a+1][b] = 'w';else copy[a+1][b] = 'b';
if(copy[a][b+1] == 'b')copy[a][b+1] = 'w';else copy[a][b+1] = 'b';
count ++;
}


int main()
{
int i,j,t,min = 16;
for(i = 1;i < 5;i ++)
scanf("%s",&table[i][1]);
for(t = 0;t < 16;t ++){
memset(firstline,0,sizeof(firstline));
int tmp = t,k = 1;          //WTF = =here the problem k which got me in trouble
while(tmp){                       //create a binary array
firstline[k] = tmp % 2;
tmp /= 2;
k ++;
}


memcpy(copy,table,sizeof(table));      //try to change to all white
count = 0;
for(k = 1;k < 5;k ++)
if(firstline[k] == 1)change(1,k);
for(i = 2;i < 5;i ++)
for(j = 1;j < 5;j ++){
if(copy[i-1][j] == 'b')change(i,j);
/*test function
for(int m = 1;m < 5;m ++){
for(int n = 1;n < 5;n ++)
printf("%c ",copy[m][n]);
printf("\n");
}
system("pause");
system("cls");
*/
}
for(j = 1;j < 5;j ++)
if(copy[4][j] != 'w')break;
if(j == 5 && count < min)min = count;   //mark the min


memcpy(copy,table,sizeof(table));     //try to change to all black
count = 0;
for(k = 1;k < 5;k ++)
if(firstline[k] == 1)change(1,k);
for(i = 2;i < 5;i ++)
for(j = 1;j < 5;j ++)
if(copy[i-1][j] == 'w')change(i,j);    //difference!
for(j = 1;j < 5;j ++)
if(copy[4][j] != 'b')break;
if(j == 5 && count < min)min = count;
}
if(min != 16)printf("%d\n",min);
else printf("Impossible\n");
return 0;
}

2011年12月8日星期四

POJ 2328 Guessing Game 超水 = =


这么水的题,怎么坑了那么多人呢? = =
想不懂
还有32ms的C++过的。。。囧
真不明白这什么过程弄的。。。。




#include”cstdio“
int main()
{
int max = 11,min = 0,t;
char s1[10],s2[10];
while(scanf("%d",&t) && t){
scanf("%s%s",s1,s2);       //原先用gets出问题(应该是get了\n),干脆就用这个了= =
if(s2[0] == 'h' && t < max)max = t;
if(s2[0] == 'l' && t > min)min = t;
if(s2[0] == 'o'){
if(t < max && t > min)printf("Stan may be honest\n");
else printf("Stan is dishonest\n");
max = 11;
min = 0;
}
}
return 0;
}

2011年12月3日星期六

百练 2754 八皇后 DFS经典题,递归,枚举

开始研究DFS好久也只弄懂个大概。。。。回溯是个问题。。。。
模拟起来总是有一定难度 = =!!
后来想一下,好像弄个全排列时间复杂度也不是很大啊。。。
试试枚举 = =
手写半小时,0ms AC....
囧~


代码水的可以。。。 = =
直接打表水过去了。。。。


#include”cstdio“
#include”algorithm“
#include”cmath“
#include“memory.h”
using namespace std;
int queen[8]={1,2,3,4,5,6,7,8};
int res[92][8];
int main()
{
int i = 0,j,k;
while(next_permutation(queen,queen + 8)){
for(j = 0;j < 7;j ++){
for(k = j + 1;k < 8;k ++)
if(abs(queen[j] - queen[k]) == abs(j - k))break;    //在对角线上
if(k != 8)break;
}
if(j == 7 && i < 92){
memcpy(res[i],queen,sizeof(queen));
i ++;
}
}
scanf("%d",&i);
while(i --){
scanf("%d",&j);
for(k = 0;k < 8;k ++)
printf("%d",res[j - 1][k]);
printf("\n");
}
return 0;
}




随后贴上DFS代码。。。。
导引上的解法,加了调试程序细心看了一次
感觉上效率不算太高。虽然模拟的过程是不错的,思想是值得学习的

#include“stdio.h”
#include“math.h”
#include“cstdlib”
int queenPlaces[92][8]; //存放92 种皇后棋子的摆放方法
int count = 0;
int board[8][8]; //仿真棋盘
void putQueen(int ithQueen); //递归函数,每次摆好一个棋子
int main()
{
int n, i, j;
for(i = 0; i < 8; i++){ // 初始化
for(j = 0; j < 8; j++)
board[i][j] = -1;
for(j = 0; j < 92; j++)
queenPlaces[j][i] = 0;
}
putQueen(0); //从第0 个棋子开始摆放,运行的结果是将queenPlaces 生成好
scanf("%d", &n);
for(i = 0; i < n; i++){
int ith;
scanf("%d", &ith);
for(j = 0; j < 8; j++)
printf("%d", queenPlaces[ith - 1][j]);
printf("\n");
}
return 0;
}
void putQueen(int ithQueen)
{
int i, k, r;
if(ithQueen == 8){
count ++;
return;
}
for(i = 0; i < 8; i++){
if(board[i][ithQueen] == -1){
//摆放皇后
board[i][ithQueen] = ithQueen;
//将其后所有的摆放方法的第ith 个皇后都放在i+1 的位置上
//在i 增加以后,后面的第ith 个皇后摆放方法后覆盖此时的设置
for(k = count; k < 92; k++)
queenPlaces[k][ithQueen] = i + 1;
//设置控制范围
for(k = 0; k < 8; k++)
for(r = 0; r < 8; r++)
if(board[k][r] == -1 && (k == i || r == ithQueen || abs(k - i) == abs(r - ithQueen)))
board[k][r] = ithQueen;


/*调试程序
for(k = 0; k < 8; k++){
for(r = 0; r < 8; r++)
printf("%3d",board[k][r]);
printf("\n");
}
system("pause");
system("cls");
*/


//向下级递归
putQueen(ithQueen + 1);
//回溯,撤销控制范围
for(k = 0; k < 8; k++)
for(r = 0; r < 8; r++)
if(board[k][r] == ithQueen) board[k][r] = -1;


/*调试程序
for(k = 0; k < 8; k++){
for(r = 0; r < 8; r++)
printf("%3d",board[k][r]);
printf("\n");
}
system("pause");
system("cls");
*/


}
}
}

2011年11月30日星期三

百练 2816 红与黑 递归水题


这题貌似搞了好一阵子。。。囧~明明是很简单的题目好不好。。。。
代码能力还是太差。。。好像还做复杂了点 = =!!
或者不需要另外开一个int数组。。。不过算了 = =
本来认为应该是DP的。。。其实感觉DP的思想也是可以的吧。。。
开始的时候没有考虑到四个角的情况,走到边上就return了 = =
后来发现不行,就增大了数组,每条边外面都加一行吧。。。
越看越觉得傻X了。。。囧~





#include“cstdio”
int num[25][25];
char table[25][25];
int x,y;
void get(int a,int b)
{
num[a][b] = 1;    //标记
if(a < 1 || b < 1 || a > y || b > x)return;
if(table[a-1][b] == '.' && num[a-1][b] != 1)get(a - 1,b);
if(table[a+1][b] == '.' && num[a+1][b] != 1)get(a + 1,b);
if(table[a][b-1] == '.' && num[a][b-1] != 1)get(a,b - 1);
if(table[a][b+1] == '.' && num[a][b+1] != 1)get(a,b + 1);
}
int main()
{
int t1,t2,t = 0;
while(scanf("%d%d",&x,&y) && x){
for(int i = 1;i <= y;i ++)
scanf("%s",&table[i][1]);    //输入数据,从[1]开始。。。
for(int i = 1;i <= y;i ++)
for(int j = 1;j <= x;j ++){
num[i][j] = 0;
if(table[i][j] == '@'){t1 = i;t2 = j;}    //清零顺便记录起始位置
}
get(t1,t2);
for(int i = 1;i <= y;i ++)
for(int j = 1;j <= x;j ++)
if(num[i][j])t++;
printf("%d\n",t);
t = 0;
}
return 0;
}


标程就是标程 = =!!
/*
int f(int x, int y){
if(x < 0 || x >= W || y < 0 || y >= H)return 0; // 如果走出矩阵范围
if(z[x][y] == '#')return 0;
else{
z[x][y] = '#'; // 将走过的瓷砖做标记
return 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1);
}
}
*/


POJ 1664 放苹果 递归水题

开始不知道处理M个苹果放N个碟子没有空的问题,和同学讨论了一下,这样可以理解为先在每个碟子上放一个苹果,这样就剩下M - N个苹果,可以在N个碟子上任意放。。。递归了 = =
想清楚了就真的水了。。。。囧~
所以说有时候递归的思路真的蛮清晰的= =!!



#include“cstdio”
int f(int a,int b)
{
if(b == 1 || a == 0)return 1;     //注意a为0的情况
if(b == 2)return 1 + a / 2;    //这里优化了一下 = =
if(a < b)return f(a,a);          //这里wa了一次,无语 = =
return f(a,b - 1) + f(a - b,b);    //分两种情况,有空盘和没有空盘的
}
int main()
{
int n,x,y;
scanf("%d",&n);
while(n --){
scanf("%d%d",&x,&y);
printf("%d\n",f(x,y));
}
return 0;
}

2011年11月27日星期日

百练 2694 逆波兰表达式 递归

这道题确实很能启发递归的思路啊。。。
但还是要吐槽下百练OJ,明明上面提示人家用cmath,结果G++不认介个。。CE = =
然后改cstdlib过了 = =
难道要用GCC? = =!!

#include"cstdio"
#include"cstdlib"
double func()
{
char s[20];
double a,b;
scanf("%s",s);
switch(s[0]){
case '+': return func() + func();
case '-': return func() - func();
case '*': return func() * func();
case '/': a = func(),b = func();
if(b) return a / b;
else return -1;    //这里return什么好。。。好像-1也不妥= =
default : return atof(s);
}
}
int main()
{
printf("%lf\n",func());
}

关于子函数的一些思考

前天和海天说起关于编程能力的问题。其实对于编程这东西,从来都是熟能生巧。自从开始做题以后,才慢慢发掘编程基本功真的好重要。简单的说,就是一种思维,或者说是条件反射。当你遇到一个问题,你很自然的会将之细分化,分隔成若干个过程,也就是子函数。这样你就只需要关心子函数的参数输入和返回值。对于整个main函数的流程构成是相当有帮助的。即使是debug的时候也可以很有针对性的进行调试。思路也要比之前只有一个主函数的时候清晰很多。
可以说,子函数就是一种解决问题的思想。对于如何快速的写出各种子函数,这就是考验编程能力的时候了。而main函数则是整个问题的基本思路。这样一道题的代码敲出来就要好看很多了。。。。
个人感觉这里面是有点面向对象的思想....不过想想也是,对象调用的成员函数不正是子函数的一种么? = =

百练 2755 二叉树 递归水题


常规思路 = =
直接打表出来,两个for找到最先相同的值。。。


#include“cstdio”
int a[20],b[20];
int main()
{
int x,y;
scanf("%d%d",&x,&y);
for(int i = 0;x + y;i ++){
if(x){a[i] = x;x /= 2;}
if(y){b[i] = y;y /= 2;}
}
for(int i = 0;a[i];i ++)
for(int j = 0;b[j];j ++)
if(a[i] == b[j]){
printf("%d\n",a[i]);
return 0;
}
return 0;
}




递归思路:



#include“cstdio”
int common(int x,int y)
{
if(x == y)return x;
if(x > y)return common(x / 2,y);
return common(x,y / 2);
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",common(a,b));
return 0;
}




数据太弱的情况,时间上看不出什么分别,但貌似递归的思路是比较巧妙的。。。。

2011年11月24日星期四

POJ 1222 EXTENDED LIGHTS OUT 暴力不水。。


喵的各种debug啊~这题从下午2点开始弄到晚上10点,加起来差不多5个多小时 T_T
总是卡在全0和全1的数据上面,我就奇怪了。。。 = =
然后查来查去,tmp数组没重置 = =
我勒个去。。。。wa了3次
细节问题很多啊,代码能力迫切需要提高 = =!!
想清楚题目的思路是一回事,实现起来是另一回事,感觉上很多题思路很清晰但是敲起代码来很困难,这题感觉上是可以写的更简洁些的,但是模拟能力不好啊。。。开始看了题目很久才想明白怎么回事。。。原来是枚举第一行的情况,确实巧妙。。。囧~
看discuss用高斯消元,高级东西矣 = =
线代没学好,翻翻书才行。。。








#include“cstdio”
#include“cstring”


int num[7][8],res[7][8],num2[7][8];


void change(int a,int b)
{
if(!num2[a][b])num2[a][b] = 1;else num2[a][b] = 0;
if(!num2[a-1][b])num2[a-1][b] = 1;else num2[a-1][b] = 0;
if(!num2[a+1][b])num2[a+1][b] = 1;else num2[a+1][b] = 0;
if(!num2[a][b-1])num2[a][b-1] = 1;else num2[a][b-1] = 0;
if(!num2[a][b+1])num2[a][b+1] = 1;else num2[a][b+1] = 0;
}


int main()
{
int n,i,j,k,tmp[8]={0};
scanf("%d",&n);
for(int count = 1;count <= n;count ++){
memset(tmp,0,sizeof(tmp));            //枚举数组忘了重置,debug了N久。。。囧~~
memset(res,0,sizeof(res));            //这个也debug了N久。。。。囧死
for(i = 1;i < 6;i ++){
for(int j = 1;j < 7;j ++)
scanf("%d",&num[i][j]);            //在矩阵中间输入数据

POJ 1543 Perfect Cubes 暴力大水


暴力水题。可优化空间很大 = =
喵的打表还是很有必要的。。。。原来94ms = =
那些个0ms的是怎么回事。。。

164K   47MS    C++    629B







#include“cstdio”
int main()
{
int n,a,b,c,d,i,t[200]={0},cube[101]={0};     //开始数组开小了,白RE了一次 = =
scanf("%d",&n);
for(i = 2;i <= n;i ++)
cube[i] = i * i * i;      //打表优化了一下,节省了一半时间 = =
for(a = 6;a <= n;a ++)
for(b = 2;b < a;b ++)
for(c = 2;c < a;c ++)
for(d = 2;d < a;d ++){
if(cube[a] == cube[b] + cube[c] + cube[d]){
for(i = 0;t[i];i ++)
if(t[i] == b * c * d)break;     //比较乘积,相同就不输出
if(!t[i]){
printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);
t[i] = b * c * d;               //不同就加入记录
}
}
else if(cube[a] < cube[b] + cube[c] + cube[d])break;
}
return 0;
}

2011年11月23日星期三

POJ 1013 Counterfeit Dollar 模拟,暴力 = =

挖一个大坑 = =
这题思路蛮清晰的,就是实现起来好像很麻烦 = =!!
模拟能力还是不够。。。
这奇葩的解法。。。囧~~

#include"iostream"
#include"string"
#include"fstream"
#include"memory.h"
using namespace std;

int main()
{
    int c[12][3];
    int res[3];
    int n, i, j;

    cin>>n;
    while(n--) {
        memset(c, 0, sizeof(c));
        memset(res, 0, sizeof(res));
        string s1, s2, s3;
        for(i=0; i<3; i++){
            cin>>s1>>s2>>s3;
            for(j=0; j
                c[s1[j]-'A'][i] = 1;
                c[s2[j]-'A'][i] = -1;
            }
            if(s3=="even"){
                res[i] = 0;
            }
            else if(s3=="up"){
                res[i] = 1;
            }
            else {
                res[i] = -1;
            }
        }
        for(i=0; i<13; i++) {
            if(c[i][0]==res[0] && c[i][1]==res[1] && c[i][2]==res[2]) {
                cout<
                break;
            }
            else if(c[i][0]==-res[0] && c[i][1]==-res[1] && c[i][2]==-res[2]) {
                cout<
                break;
            }
        }
    }
    return 0;
}

2011年11月20日星期日

POJ 1006 生理周期 暴力大水

以前做过,那时题目看得半懂不懂的。。。。原来这么水,囧~
运用数论的知识应该还可以优化。但信安数学基础学的不好啊,同余用不上。囧~
貌似用中国剩余定理可以做 = =
程序设计导演上面的解法也是不错的。。。。嘛
16ms = =!!
我的也要94ms....囧死



#include“cstdio”
int main()
{
int p,e,i,d,count = 1;
while(scanf("%d%d%d%d",&p,&e,&i,&d) && p != -1){
int res = 0;
for(int k = 0;k < 700;k ++){
i %= 33;           //这里wa了一次。囧~
res = i + 33 * k;     //取最大的除数33,效率比较高
if(!((res - e) % 28) && !((res - p) % 23) && res > d){
printf("Case %d: the next triple peak occurs in %d days.\n",count,res - d);
count ++;
break;
}
}
}
return 0;
}








优化算法:



while(scanf("%d%d%d%d", &p, &e, &i, &d) && p!=-1){
 for(j=d+1; j<21252; j++)
  if ((j-p)%23 == 0) break;
 for( ; j<21252; j=j+23)
   if ((j-e)%28 == 0) break;
 for( ; j<21252; j=j+23*28)
  if ((j-i)%33 == 0) break;
}




3个for...怎么就快了 = =

2011年11月19日星期六

POJ 1580 String Matching 模拟,简单DP


思路没什么好说的。简单DP。
囧~开始果断又是想复杂了。折腾好久都没出来。。。原来就三个for。。。晕~
说起来是真没意识到这是动规呢。

164K  0MS   C++   716B

#include"cstdio"
#include"cstring"
char s1[200],s2[200];
int gcd(int a,int b)
{
return b ? gcd(b,a % b) : a;
}
int main()
{
while(scanf("%s",s1) && s1[0] != '-'){
scanf("%s",s2);
if(!strcmp(s1,s2)){printf("appx(%s,%s) = 1\n",s1,s2);continue;}
int max = 0,t = 0;
int len1 = strlen(s1),len2 = strlen(s2);
for(int i = 0;i < len1;i ++){
for(int j = 0;j < len2;j ++){
for(int i1 = i,j1 = j;i1 < len1 && j1 < len2;i1 ++,j1 ++)
if(s1[i1] == s2 [j1])t ++;
if(t > max)max = t;
t = 0;
}
}
if(!max){printf("appx(%s,%s) = 0\n",s1,s2);continue;}
int x = max * 2,y = len1 + len2;
printf("appx(%s,%s) = %d/%d\n",s1,s2,x / gcd(x,y),y / gcd(x,y));
}
return 0;
}

2011年11月17日星期四

POJ 1833 排列 (纯模拟)



纯模拟题,算法还算清晰。感觉可优化的地方很多,比如搜索大于某数的最小数可用二分。嫌麻烦就没写了。数据水啊 = =
好在一次水过。。。。。


应该还有STL的next_permutation 函数可以水过的,但是想自己练练手~

172K     469MS      C++       968B     2011-11-17 16:07:49 


喵的逼我用双引号,标签你妹啊


#include"cstdio"
#include"cstdlib"
int cmp(const void *elem1,const void *elem2){
return *(int *)elem1 - *(int *)elem2;
}
int main()
{
int m,n,k;
scanf("%d",&m);
while(m --){
scanf("%d%d",&n,&k);
int num[1100] = {0},i,j;
for(int i = 0;i < n;i ++)
scanf("%d",&num[i]);
while(k){
for(i = n - 1;i > 0;i --){
if(num[i] < num[i-1])continue;         //后一个数比前一个数小则继续
else {
for(j = i;j < n;j ++){
if(num[j] < num[i-1]){         //在[i,n-1]的区间找到比num[i-1]大的最小的数,交换之
num[j - 1] ^= num[i - 1];
num[i - 1] ^= num[j - 1];
num[j - 1] ^= num[i - 1];
break;
}
}
if(j == n){                         //没找到则num[i-1]和表尾交换
num[n - 1] ^= num[i - 1];
num[i - 1] ^= num[n - 1];
num[n - 1] ^= num[i - 1];
}
qsort(num + i,n - i,sizeof(int),cmp);  //[i,n-1]排序
k --;
break;
}
}
if(i == 0){qsort(num,n,sizeof(int),cmp);k--;}  //已经是最大的排列,则重新从小到大排列
}
for(int i = 0;i < n;i ++){
if(i == n - 1){printf("%d\n",num[i]);break;}
printf("%d ",num[i]);
}
}
return 0;
}