收到微软亚洲研究院(MSRA)的接收通知

No Comments

今天中午,收到微软的接收通知,本来昨天等了一整天第四个面试电话,结果等到10点多也没来,心情不好就直接睡觉去了,没想到今天一起床插上电话线就收到微软打来的接收电话。确定6月25日出发去北京。一个暑假这样过,也许比在家里自己造点东西更有意义吧。

上张挺有意思的图:
200705150949514dcc7.jpg

P.S. 今天还拆掉了我的IBM R51,本来准备换根灯管,结果…新灯管有点长,被我试图剪掉一部分金属导电端时不小心…断了…只好再装起来。庆幸我没先焊下旧的来才发现新的长…

古墓丽影8:10周年纪念版

No Comments

昨天经过强哥寝室,看到在玩古墓丽影8:10周年纪念版的泄露版,看得入神,觉得挺好玩的,于是乎就挂了个BT下了一晚上,早上终于下好,装上进入游戏,原来最新的游戏防盗版技术也是最差的,居然不用做什么就能正常游戏了…不管怎么样,公平地讲,这个游戏是我最近见过的最好的游戏,可能还没有波斯王子那么炫,不过一个一个谜题,脑子开始不够用啦。

ceuuhhhpgvswq.jpg

微软MSRA电话面试(第二天)

5 Comments

今天中午就接到MSRA的第二个电话面试,有点奇怪,因为前面几个电话都是晚上,我一直以为微软的前辈们都按照美国时间工作…结果今天在我午睡正香的时候打来了电话,开始问了几个项目的事情,我晕晕乎乎答得语无伦次,我明白他想知道关于开发中遇到的难题,然后我是怎么克服的,无奈实在不清醒…都想不起来了,结果我想他没有得到太多想得到的吧。之后,给我出了一个简单的算法题目要求写出来,听工程院实习的同学讲,当面面试的时候都会直接写在白板上,然后由微软的人录入编译的,这样放给我自己做,我觉得还算是降低难度了吧。

题目是这样的:有一个矩阵,每个元素是一个数,要求,从左上角出发到达右下角,每次只能向右或向下,要求全路线经过的元素和最小,求出路径及这个和的值。要求分别用递归和非递归方法实现之。
结果图:
matrix1.jpg
我花了一下午,写出了这个程序,幸运的是,两种方法的结果竟然相同…
哈哈~~玩笑话,放出代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace Matrix
{
    class Program
    {
        /// <summary>
        /// 矩阵元素的最大值,用于生成随机矩阵
        /// </summary>
        private static int MAX_ELEMENT = 10;
        /// <summary>
        /// 矩阵的高度
        /// </summary>
        private static int MATRIX_X = 4;
        /// <summary>
        /// 矩阵的宽度
        /// </summary>
        private static int MATRIX_Y = 15;

        /// <summary>主函数</summary>
        /// <param name="args">命令行参数</param>
        static void Main(string[] args)
        {
            //初始化一个目标矩阵
            int[,] matrix = new int[MATRIX_X, MATRIX_Y];
            //初始化一个方向矩阵
            string[,] direction = new string[MATRIX_X, MATRIX_Y];
            //随机生成目标矩阵的元素
            Generate(ref matrix, MATRIX_X, MATRIX_Y);
            Console.WriteLine("Target Matrix is:");
            //打印矩阵
            PrintMatrix(matrix, MATRIX_X, MATRIX_Y);

            //递归法
            Console.Write("\r\nMethod No.1 Result\r\nMinCost=" + Step(direction, matrix, MATRIX_X, MATRIX_Y, MATRIX_X - 1, MATRIX_Y - 1));
            //打印结果
            PrintDirection(direction, MATRIX_X, MATRIX_Y);

            //清空方向矩阵
            direction = new string[MATRIX_X, MATRIX_Y];
            //非递归法
            PrintMinCostRoute(direction, matrix, MATRIX_X, MATRIX_Y);
        }

        /// <summary>随机生成目标矩阵</summary>
        /// <param name="matrix">目标矩阵的引用</param>
        /// <param name="x">矩阵宽度</param>
        ///<param name="y">矩阵高度</param>
        static private void Generate(ref int[,] matrix, int x, int y)
        {
            //如果未初始化,先初始化之
            if (matrix == null)
            {
                matrix = new int[x, y];
            }
            //随机生成元素
            Random random = new Random();
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    matrix[i, j] = random.Next(MAX_ELEMENT - 1) + 1;
                }
            }
        }

        /// <summary>非递归寻找最小值及路径</summary>
        ///<param name="direction">路径矩阵</param>
        ///<param name="matrix">目标矩阵</param>
        ///<param name="x">矩阵宽度</param>
        ///<param name="y">矩阵高度</param>
        static private void PrintMinCostRoute(string[,] direction, int[,] matrix, int x, int y)
        {
            //动态规划备忘录矩阵
            int[,] cost = new int[x, y];
            //初始化各节点为整型变量最大值
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    cost[i, j] = int.MaxValue;
                }
            }
            //从左上角逐次扩大矩阵
            for (int i = 0; i < (x >= y ? x : y); i++)
            {
                //左上角
                if (i == 0)
                {
                    //就是本身
                    direction[0, 0] = "S";
                    cost[0, 0] = matrix[0, 0];
                }
                else
                {
                    //顺次检查当前方阵周围的元素
                    for (int k = 0; k < i + 1; k++)
                    {
                        //如果范围合法
                        if (i < x && k < y)
                        {
                            //检查比较当前的最小值和从上面过来的值
                            if (cost[i, k] >= (cost[i - 1, k] + matrix[i, k]))
                            {
                                //上面更小则更新
                                cost[i, k] = cost[i - 1, k] + matrix[i, k];
                                direction[i, k] = "U";
                            }
                            if (k >= 1)
                            {
                                //检查比较当前的最小值和从左面过来的值
                                if (cost[i, k] >= (cost[i, k - 1] + matrix[i, k]))
                                {
                                    //左面更小则更新
                                    cost[i, k] = cost[i, k - 1] + matrix[i, k];
                                    direction[i, k] = "L";
                                }
                            }
                        }
                        //如果范围合法
                        if (i < y && k < x)
                        {
                            //检查比较当前的最小值和从上面过来的值
                            if (cost[k, i] >= (cost[k, i - 1] + matrix[k, i]))
                            {
                                //上面更小则更新
                                cost[k, i] = cost[k, i - 1] + matrix[k, i];
                                direction[k, i] = "L";
                            }
                            if (k >= 1)
                            {
                                //检查比较当前的最小值和从上面过来的值
                                if (cost[k, i] >= (cost[k - 1, i] + matrix[k, i]))
                                {
                                    //左面更小则更新
                                    cost[k, i] = cost[k - 1, i] + matrix[k, i];
                                    direction[k, i] = "U";
                                }
                            }
                        }
                    }
                }
            }
            Console.Write("\r\n\r\nMethod No.2 Result\r\nMinCost=" + cost[x - 1, y - 1]);
            PrintDirection(direction, x, y);
        }

        /// <summary>一步递归求某位置的最小值</summary>
        ///<param name="direction">路径矩阵</param>
        ///<param name="matrix">目标矩阵</param>
        ///<param name="x">矩阵宽度</param>
        ///<param name="y">矩阵高度</param>
        ///<param name="pos_x">位置x坐标</param>
        ///<param name="pos_y">位置y坐标</param>
        /// <returns>这个位置的最小值</returns>
        static private int Step(string[,] direction, int[,] matrix, int x, int y, int pos_x, int pos_y)
        {
            //Debug用
            //Console.WriteLine("pos_x=" + pos_x + ",pos_y=" + pos_y);
            //第一行的元素
            if (pos_x == 0)
            {
                //第一个元素,递归结束,返回本身的值
                if (pos_y == 0)
                {
                    //特殊位置,路径指向Self="S"
                    direction[pos_x, pos_y] = "S";
                    //返回本身的值
                    return matrix[pos_x, pos_y];
                }
                //第一行非第一个,必然从左边走过来
                else
                {
                    //路径指向Left="L"
                    direction[pos_x, pos_y] = "L";
                    //左边一个的最优值加上本身得到最优值
                    return Step(direction, matrix, x, y, pos_x, pos_y - 1) + matrix[pos_x, pos_y];
                }
            }
            //第一列的元素,必然从上边走过来
            if (pos_y == 0)
            {
                //路径指向Up="U"
                direction[pos_x, pos_y] = "U";
                //上边一个的最优值加上本身得到最优值
                return Step(direction, matrix, x, y, pos_x - 1, pos_y) + matrix[pos_x, pos_y];
            }
            //避免重复计算,先取到上面一个和左边一个的最优值
            int up = Step(direction, matrix, x, y, pos_x - 1, pos_y);
            int left = Step(direction, matrix, x, y, pos_x, pos_y - 1);
            //如果从上面走合算
            if (up <= left)
            {
                //路径指向Up="U"
                direction[pos_x, pos_y] = "U";
                //上边一个的最优值加上本身得到最优值
                return up + matrix[pos_x, pos_y];
            }
            //如果从左面走合算
            else
            {
                //路径指向Left="L"
                direction[pos_x, pos_y] = "L";
                //左边一个的最优值加上本身得到最优值
                return left + matrix[pos_x, pos_y];
            }
        }

        /// <summary>打印矩阵</summary>
        ///<param name="matrix"></param>
        ///<param name="x"></param>矩阵宽度///
        ///<param name="y"></param>矩阵高度
        static private void PrintMatrix(int[,] matrix, int x, int y)
        {
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    Console.Write(matrix[i, j].ToString() + " ");
                }
                Console.Write("\r\n");
            }
        }

        /// <summary>打印所走的路径矩阵及走法</summary>
        ///<param name="matrix">路径矩阵</param>
        ///<param name="x">路径矩阵宽度</param>
        ///<param name="y">路径矩阵高度</param>
        static private void PrintDirection(string[,] matrix, int x, int y)
        {
            //打印路径矩阵
            Console.WriteLine("\r\nThe Direction Matrix:");
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    Console.Write(matrix[i, j] + " ");
                }
                Console.Write("\r\n");
            }

            //打印走法
            Console.Write("The Route is:");
            //走法的逆序存放数组
            string[] Reverse = new string[x + y - 2];
            int pos_x = x - 1;
            int pos_y = y - 1;
            //从终点开始向路径矩阵指示的方向回溯走法
            for (int i = 0; i < (x + y - 2); i++)
            {
                //从左边来的
                if (matrix[pos_x, pos_y].Equals("L"))
                {
                    pos_y--;
                    Reverse[i] = "right";
                }
                //从上边来的
                else
                {
                    pos_x--;
                    Reverse[i] = "down";
                }
            }

            //倒序打印走法的逆序存放数组,得到真正的从起点出发的走法
            for (int i = 0; i < (x + y - 2); i++)
            {
                //倒序打印
                Console.Write(Reverse[(x + y - 2) - i - 1]);
                if (i < (x + y - 3))
                {
                    //不是最后一个的时候打一个分隔号
                    Console.Write(",");
                }
            }
        }
    }
}

Nokia 3250

2 Comments

最近进的新玩意挺多的…原来的Nokia 6020光荣退休,新进了智能手机Nokia 3250,此款手机采用S60第三版系统,可扩展性极强,E-mail,MSN,QQ一个不落下,属于全能战斗机~

3250-1.jpg

3250-2.jpg

小工具-代码行统计工具

No Comments

推荐一款小工具,没有的话搞些论文什么的时候想数出项目的代码行数挺不方便的.这个工具可以一次性数出一个目录下的代码的行数,并区分指令行和注释行.P.S. 我毕业设计程序里的注释已经达到50%了~看来实习期间得我们项目经理的真传还是很受用的~

可用于对VC++、C++ Builder、Delphi、VB、C/C++、ASM、Java等程序源码进行详细的统计,可以非常准确的分析出程序中代码行、注释行和空白行的行数。程序会自动根据你选择的文件类型选择相应的统计方式,并将所有文件的分析结果进行汇总,便于方便直观的对程序代码量进行全面的统计。本软件是绿色软件,不需要安装,展开到任意目录,直接运行即可。

下载链接:counter.zip

把信送给加西亚

No Comments

大班长之职,说大不大,说小也不小.总管系里学生的事务也一年多了,现在大学生的责任心实在实在是太差了.四年级了,很多事情如果我不牵头做,就不会有人做,哪怕这件事情涉及到一个学生能否顺利毕业这样的生死大事,一样会被一些不负责任的班长淹没在网络游戏中不置可否.我是山东人,性子直,如果我知道一件事,如果我能够判断这件事的是非,我一定会把它做好.你说说这种事情,这种班长让我怎么管…唉,四年级了,得过且过吧,不过事情还是要办,再忍1个月,我就自由了~等到了研究生阶段,当个更大的官,非得找几个有我一样负责任的下属不行…我就不信同济里找不出这样的人.

一篇文章,恰是说到这一点.尤其是中间的问答,简直和显示中我遇到的,绝妙相似~~

  在一切有关古巴的事件中,有一个人最让我忘不了。
  美西战争期间,美国必须立即跟西班牙的反抗军首领取得联系。加西亚将军在古巴丛林的山里——没有人知道确切的地点,所以无法写信或打电话给他。美国总统必须尽快地获得他的合作。
  怎么办呢?
  有人对总统说:“有一个人名叫罗文的人,有办法找到加西亚。”
  他们把罗文找来,当罗文从总统手中接过写给加西亚的信之后,把它装进一个油布制的袋里,封好,吊在胸口,划着一艘小船,四天之后的一个夜里在古巴上岸,消逝于丛林中,三个星期之后,经过千辛万苦,从古巴岛的那一边出来,徒步走过一个危机四伏的国家,把那封信亲手交给了加西亚将军。  就是这么简单的一个故事。但是,它却流传到世界各地。我要强调的重点是:麦金利总统把一封写给加西亚的信交给予了罗文,而罗文接过信之后,并没有任何愚蠢的问题:“他在什么地方?怎么去找?”
像他这种人,我们应该为他塑造不朽的雕像,放在每一所大学里,年轻人所需要的不是学习书本上的知识,也不是聆听他人种种的指导,而是要加强一种敬业精神,对于上级的托付,立即采取行动,全心全意去完成任务——“把信带给加西亚”。
  加西亚将军已不在人间,但现在还有其他的加西亚。顾客、客户以及工作服务的对象,就是我们企业的加西亚。不提任何愚蠢的问题,不谈任何条件,不顾一切地把服务送到他们的手上,我们能做到吗?
凡是需要众多人手的企业经营者,有时候都会因为一般人的被动——无法或不愿专心去做一件事——而大吃一惊:懒懒散散,漠不关心,马马虎虎的做事态度,似乎已经变成常态;除非苦口婆心、威迫利诱地叫属下帮忙,或者除非奇迹出现——上帝派一名助手给他,没有人把事情办成。
  在一家大公司里,总经理对我说:“你看那个业务员。”
  “我看到了,他怎样?”
  “他是个不错的大学生,不过如果我派他到城里去办个小差事,他可能把任务完成,但也可能就在途中走进一家商场”
  这种人你能派他送信给加西亚吗?
我们再来做个试验:你此刻坐在办公室里——周围有6名职员。 把其中一名叫来,对他说:“请帮我查一查百科全书,把哥立奇的生平做成一篇摘录。”
  那个职员绝不会静静地说:“好的,先生”,然后就去执行。
  他反而会满脸狐疑的提出一个或数个下列的问题:
  他是谁呀?
  哪套百科全书?
  百科全书放在哪儿?
  这是我的工作吗?
  你不是指俾斯麦吧?
  为什么不叫别人去做呢?
  他是过世的人吗?
  急不急?
  我是否把书拿来,因为你比较熟悉,由你自己来查好么?
  你为什么要查他?

  在你回答了他所提出的问题、解释了怎么样去查那资料,以及你为什么要查的理由之后,那个职员会走开,去找另一个职员帮忙他查哥立奇的资料,然后又回来对你说,根本查不到这个人。
你只能满面笑容地说:“算啦”,然后自己去查。但这种被动的行为,这种道德的愚行,这种心灵的脆弱,这种姑息的作风——都在把这个社会带到三个和尚没水喝的危险境界。
  近来我们听到许多人,为“那些为了廉价工资工作而又无出头之日的职员”,表示出同情,同时又把那些雇主骂得体无全肤。并非所有老板都是贪婪者、专横者,就像并非所有的人都是善良者。
  但从没有人提到,有些老板一直到年老,都无法使那些不求上进的懒虫做点正经的工作,而很多工作都是由老板自己默默完成的;也没有人提到,有些老板长久而耐心地想感动那些当他一转身就投机取巧的“员工”。在每个商店和工厂,都有一个持续的整顿过程,公司负责人经常地送走那些显然无法对公司有所贡献的“员工”,同时也吸引新的进来。
  无论业务怎么忙碌,这种整顿都必须一直在进行着。只有当景气不佳,就业机会不多,整顿才会出现较佳的成绩——那些不能胜任没有才能的人,都被摒弃在就业的大门之外。只有最能干的人,才会被留下来。
为了自己的利益,使得每个老板只保留那些最佳的职员——那些能够把信带给加西亚的人。
我很钦佩的是那些不论老板是否在办公室都努力工作的人;我也敬佩那些能够把信交给加西亚的人;静静地把信拿去,不会提出任何愚笨问题,也不会存心随手把信丢进水沟里,而是不顾一切地把信送到;这种人永远不会被“解雇”,也永远不必为了要求加薪而罢工。文明,就是为了焦心地寻找这种人才的一段长远过程。这种人无论要求任何事物都会获得,他在每个城市、村庄、乡镇——每个办公室、公司、商店、工厂,都会受到欢迎。世界上急需这种人才,这种能够把信带给加西亚的人。
形成良好的的职业素质,你就一定是最受欢迎的!

SONY T100

No Comments

大大的柯尼卡美能达A2带出去毕竟不方便,所以新进SONY的T100~T100具有810万像素(科技发展快啊,1/2.5英寸传感器就能做到800w了,不过后来证明这个800w并不如我的A2的800w效果,如此看来传感器部件尺寸真的是最关键因素).T100有一个3英寸的液晶屏,看起来很爽~此外的闪光点在于T100具有准确的人脸识别功能,在生活随拍当中起到了很大的作用~

photo023444554.jpg

976111_sonyt20t100_02.jpg