posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

很简短,有点trick的感觉,就像小学里写的那些(n-1) mod x + 1。进了大学后很少写类似风格的代码了,这些用在java项目中就要因为可读性被bs了。
1. 计算串长度 strlen(a)
for (i = 0; a[i] != 0; i++); return i;

2. 复制 strcpy(a, b)
for (i = 0; (a[i] = b[i]) != 0; i++);

3. 比较 strcmp(a, b)
for (i = 0; a[i] == b[i]; i++)
    if (a[i] == 0) return 0;
return a[i] - b[i];
注意适用于不同长度的字符串

指针版本
1. strlen(a)
b = a; while (*b++); return b - a - 1;

2. strcpy(a, b)
while (*a++ = *b++);

3. strcmp(a, b)
while (*a++ = *b++)
    if (*(a-1) == 0) return 0;
return *(a-1) - *(b-1);



posted @ 2007-07-08 21:05 ZelluX 阅读(495) | 评论 (2)编辑 收藏

wrong answer了几次,总算过了
gdb还是不怎么会用,调试dfs时不知道怎么跳出当前层(finish和up貌似都不管用),以及如何step over

/*

PROG: lamps
ID: 06301031
LANG: C++
*/

#include 
<iostream>
#include 
<fstream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

struct StateArray
{
    
bool value[100];
};

int n, c;
int methodCount = 0;
vector
<int> reqOn, reqOff;
vector
<StateArray> result;
int method[4];
bool state[100];   // On - true,  Off - false

bool equalState(const StateArray& s1, const StateArray& s2)
{
    
for (int i = 0; i < n; i++)
        
if (s1.value[i] != s2.value[i])
            
return false;
    
return true;
}

bool compareState(const StateArray& s1, const StateArray& s2)
{
    
for (int i = 0; i < n; i++)
        
if (s1.value[i] != s2.value[i])
            
return !s1.value[i];
    
return false;
}

void changeState(int m) // m[0,4] refers to the method
{
    
switch (m)
    {
        
case 0:
            
for (int i = 0; i < n; i++)
                state[i] 
= !state[i];
            
break;
        
case 1:
            
for (int i = 0; i < n; i += 2)
                state[i] 
= !state[i];
            
break;
        
case 2:
            
for (int i = 1; i < n; i += 2)
                state[i] 
= !state[i];
            
break;
        
case 3:
            
for (int i = 0; i < n; i += 3)
                state[i] 
= !state[i];
            
break;
    }
}

bool validState()
{
    
for (int i = 0; i < reqOn.size(); i++)
        
if (!state[reqOn[i]])
            
return false;
    
for (int i = 0; i < reqOff.size(); i++)
        
if (state[reqOff[i]])
            
return false;
    
return true;
}

void DFS(int t)  // t: method number
{
    
if ((methodCount > c) || (t >= 4))
        
return;
    
for (int i = 0; i < 2; i++)
    {
        
if (i == 1)
        {
            methodCount
++;
            changeState(t);
            
if (((c - methodCount) % 2 == 0&& validState())
            {
                StateArray tempState;
                
for (int j = 0; j < n; j++)
                {
                    tempState.value[j] 
= state[j];
                }
                result.push_back(tempState);
            }
            DFS(t 
+ 1);
            methodCount
--;
            changeState(t);
        }
        
else
        {
            
if (((c - methodCount) % 2 == 0&& validState())
            {
                StateArray tempState;
                
for (int j = 0; j < n; j++)
                {
                    tempState.value[j] 
= state[j];
                }
                result.push_back(tempState);
            }
            DFS(t 
+ 1);
        }
    }
}

int main()
{
    ifstream fin(
"lamps.in");
    ofstream fout(
"lamps.out");
    fin 
>> n >> c;
    
int x;
    
while (fin >> x)
        
if (x == -1)
            
break;
        
else
            reqOn.push_back(x 
- 1);
    
while (fin >> x)
        
if (x == -1)
            
break;
        
else
            reqOff.push_back(x 
- 1);
    
for (int i = 0; i < n; i++)
        state[i] 
= true;
    DFS(
0);
    
if (result.size() < 1)
        fout 
<< "IMPOSSIBLE\n";
    sort(result.begin(), result.end(), compareState);
    vector
<StateArray>::iterator iter;
    vector
<StateArray> uni;
    
for (iter = result.begin(); iter != result.end(); iter++)
        
if (uni.empty() || !equalState(uni[uni.size() - 1], *iter))
            uni.push_back(
*iter);
    
for (int i = 0; i < uni.size(); i++)
    {
        
for (int j = 0; j < n; j++)
        {
            fout 
<< uni[i].value[j];
        }
        fout 
<< endl;
    }
    
return 0;
}

posted @ 2007-06-29 22:29 ZelluX 阅读(269) | 评论 (0)编辑 收藏

Wrong Answer了半天发现原来是m - 1打成m + 1了。。。
/*
PROG: castle
ID: 06301031
LANG: C++
*/

#include 
<iostream>
#include 
<fstream>

using namespace std;

enum Direction {WEST = 0, NORTH = 1, EAST = 2, SOUTH = 3};

// The directions corresponding to the following steps are 
// West(0), North(1), East(2) and South(3).
const int dx[] = {0-101};
const int dy[] = {-1010};

int region[50][50];
int colors[50 * 50];
int maze[50][50];

bool canGo(int value, int dirx)
{
    
int base = 1;
    
for (int i = 0; i < dirx; i++)
        
base *= 2;
    
return ((base & value) == 0);
}

void floodfill(int x, int y, int color)
{
    
if (region[x][y] < 0)
    {
        region[x][y] 
= color;
        colors[color]
++;
    }
    
//cout << "now paint " << x << ',' << y << endl;
    for (int i = 0; i < 4; i++// dirction
    {
        
if (canGo(maze[x][y], i) && region[x + dx[i]][y + dy[i]] < 0)
        {
            floodfill(x 
+ dx[i], y + dy[i], color); 
        }
    }
}

int main() 
{
    ifstream fin(
"castle.in");
    ofstream fout(
"castle.out");
    
int m, n;
    fin 
>> n >> m;
    
for (int i = 0; i < m; i++)
        
for (int j= 0; j < n; j++)
        {
            fin 
>> maze[i][j];
            region[i][j] 
= -1;
        }

    
int colorCount = 0;
    
int maxCount = 0;
    
for (int i = 0; i < m; i++)
        
for (int j = 0; j < n; j++)
            
if (region[i][j] < 0)
            {
                colors[colorCount] 
= 0;
                floodfill(i, j, colorCount);
                
if (maxCount < colors[colorCount])
                    maxCount 
= colors[colorCount];
 
//               for (int ii = 0; ii < m; ii++) {
 
//                   for (int jj = 0; jj < n; jj++)
 
//                       cout << (region[ii][jj] >= 0 ? region[ii][jj] : ' ');
 
//                   cout << endl;
 
//               }
 
//               cout << i << ',' << j << ':' << colorCount << ' ' << colors[colorCount] << endl;
                colorCount++;
            }
    fout 
<< colorCount << endl;
    fout 
<< maxCount << endl; 
    
int maxCombine = 0, maxD, maxI, maxJ;
    
for (int j = 0; j < n; j++)
        
for (int i = m - 1; i >= 0; i--)
            
for (int d = 1; d < 3; d++)
            {
                
int nx = i + dx[d];
                
int ny = j + dy[d];
                
if (nx < 0 || nx >= m || ny < 0 || ny >= n) 
                    
continue;
                
if (region[nx][ny] != region[i][j])
                {
                    
if (maxCombine < colors[region[nx][ny]] + colors[region[i][j]])
                    {
                        maxCombine 
= colors[region[nx][ny]] + colors[region[i][j]]; 
                        maxD 
= d; 
                        maxI 
= i;
                        maxJ 
= j;
                    }
                }
            }
    fout 
<< maxCombine << endl;
    fout 
<< maxI + 1 << ' ' << maxJ + 1 << ' ';
    
switch (maxD)
    {
        
case 0: fout << 'W' << endl;
                
break;
        
case 1: fout << 'N' << endl;
                
break;
        
case 2: fout << 'E' << endl;
                
break;
        
case 3: fout << 'S' << endl;
                
break;
    }
    
return 0;
}

posted @ 2007-06-19 22:03 ZelluX 阅读(311) | 评论 (0)编辑 收藏

在水源上看到的,大概的做法是
求前n项和序列S1, S2, ..., Sn,问题即转化为求i, j,使得Si - Sj = X
把{Sk}和{Sk + X}序列中的数都放入hash表中,查找冲突项。

posted @ 2007-06-19 21:33 ZelluX 阅读(221) | 评论 (0)编辑 收藏

BBS上peter大牛的问题:

char *s = "string1";
strcpy(s, "string2");
这样为什么会segmentation fault?

后面的解答:

char *s="string1" //此时"string1"在常量区 s是指向常量区的一个指针 你不能对
常量区的内容进行修改

char s[]="string2" //此时"string2" 在栈区 此时可以对里面的内容进行修改

所以你可以写成

char s[]="string1";
strcpy(s,"string2");

posted @ 2007-06-17 20:22 ZelluX 阅读(705) | 评论 (2)编辑 收藏

http://www.aurora-x.net/blog/oasis/?p=92
by opengl@rygh

现在市面上系统的,由浅及深的讲Ruby的书凤毛麟角,这本是分量最重的一本。原书第二版出版到现在也过去两年了,国内刚刚在这个月由博文引进电工发行了译本。

800+页的大部头,一半是核心库和标准库的参考,另外一半分为三个部分——基础、环境、高级。这其中我觉得比较有价值的部分在于“高级这一块”有助于让你从一个更高的层次来理解和掌握这门语言,这一部分也是需要经常参考的部分。

就国内目前引进的唯一一本算是讲Ruby的书,要从这本书开始学习Ruby估计会吓跑不少潜在用户。作者是大牛没错,不过教学则是另一回事了(大家都应有体会,本科上课的时候课讲的最好的老师通常都不是学术最牛的老师)。缺点有两处很明显:

第一是自顶向下,它的顺序是这样的:

对象和类–>容器、集合–>标准类型–>表达式–>异常和模块–>基本输入输出

一个从上降到低又陡然上升的过程。作者自己也说在第一版里这样的效果并不好,因此在第二版里特意增加了一个介绍性章节,粗略的先把所有东西列给读者看一遍。虽然起到些作用,但是实际效果我想对于初学者来说仍然不会太好。C++/Java的书我都读过不少,也没见哪个是一上来就把Class/Object这些东西甩给读者的,总是从基本类型、控制语句过渡。除非你已经对OO这套相当熟悉了,否则上来这个门槛就能把一堆新手挡在门外。

接下来的,谈不上十分晦涩,但也不是什么读来轻快的内容,关键是作者给的例子较少,使得象块、迭代这些特色难以掌握。再有一点,ruby的语法风格有相当部分还保留有Perl的痕迹,而Perl是出了名的以奇怪符号著称于世,这些符号在新手眼里不外天书,而高手们则爱不释手。

所以,要能比较顺利的通过这本书的入门之路,你得事先具有OO的基础,至少一门脚本语言的经验(Perl最佳),函数式编程的一些概念(否则当你看到块的一些用法时会很迷惑)。然后,可以用Ruby笨拙的写一些小程序了。

Ruby作为动态语言之一,它的最大特点自然是“动态”两个字,其著名的“duck typing”就是一大体现(在我看来,就像是基于接口的调用,但却并不用一个给定的接口去事先限制)。这些在高级部分里都有专门讲述,是应该重点学习的部分。

那么入门究竟用什么书更好?我推荐《Everyday Scripting with Ruby》这本。和《Programming Ruby》同一个出版社,今年一月份刚出了原版。它是以相当循序渐进的方式带领读者进入Ruby的世界,尤其是作者精心设计的几个Project是全书亮点(学习一门语言最好的方式还是要动手写程序)。

最后总结如下,首先看《Everyday》这本书,跟着书中的指导摆弄过所有的Project,并完成相应的练习。然后再看《Programmin》一书的Crystallized部分。再之后就主要是当作API参考手册了。花钱去买中文版我个人觉得不是很有必要,总共四部分中,前两部分我觉得蛮鸡肋的,第四部分在电脑上查更方便,只有第三部分有较高的价值。

posted @ 2007-06-16 19:54 ZelluX 阅读(708) | 评论 (0)编辑 收藏

1. Array#reject 方法遍历一个集合的每个元素,并把符合条件的元素删去。
例如去掉数组中的所有素数
nums = nums.reject do | num |
prime?(num)
end
puts nums

2. String#chomp 方法
str.chomp(separator=$/) => new_str
Returns a new +String+ with the given record separator removed from
the end of _str_ (if present). If +$/+ has not been changed from
the default Ruby record separator, then +chomp+ also removes
carriage return characters (that is it will remove +\n+, +\r+, and
+\r\n+).

"hello".chomp #=> "hello"
"hello\n".chomp #=> "hello"
"hello\r\n".chomp #=> "hello"
"hello\n\r".chomp #=> "hello\n"
"hello\r".chomp #=> "hello"
"hello \n there".chomp #=> "hello \n there"
"hello".chomp("llo") #=> "he"

3. 判断是否在命令行运行脚本
if $0 == __FILE__
check_usage
compare_inventory_files(ARGV[0], ARGV[1])
end
类似于Java类的main方法,在被其他类导入时不会运行其中的代码。

4. Enumerable#any? 方法查找一个集合中是否有满足条件的元素
irb(main):004:0> deposits = [1, 0, 10000]
irb(main):005:0> deposits.any? do | deposit |
irb(main):006:1* deposit > 9999
irb(main):007:1> end
=> true

5. 关于测试
这本书(Everyday Scripting with Ruby)的很多程序都是依循测试驱动开发的思想写出来的,测试单元中的方法通常有两种目的。
一种是direct test,需要测试那个函数就直接调用那个函数,传递的参数都是直接写出来的。
另一种是bootstrapping test,被测试函数的参数也是通过生成这些参数的函数生成的,即一个方法测试了多个对象。
Everyone finds their own balance between testing directly and testing indirectly. You will too.

6. Time#strftime 方法
t = Time.now
t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003"
t.strftime("at %I:%M%p") #=> "at 08:56AM"

posted @ 2007-06-16 19:30 ZelluX 阅读(284) | 评论 (0)编辑 收藏

先把各种热门的东西都走马观花地看一遍,呵呵。
看的是Everyday Scripting with Ruby,风格和In Action系列差不多,大量的实例。
现在学Ruby的主要目的也是everyday scripting,方便数据处理、生成,文件批处理等,RoR之类的暂时不考虑。

1. String.inspect 方法
文档中的说法是
     str.inspect   => string

     Returns a printable version of _str_, with special characters
     escaped.

        str = "hello"
        str[3] = 8
        str.inspect       #=> "hel\010o"

具体情况试试 myString.inspect.inspect....就能了解一点了

2. Arrays.each 和 Arrays.collect
for_each方法

irb(main):007:0> [1, 2, 3].each do | element |
irb(main):008:1*   puts element
irb(main):009:1> end
1
2
3
=> [1, 2, 3]

后者与前者的不同之处在于,在处理数据的同时,每次处理的返回结果都会保存到一个新的数组中返回。
irb(main):036:0> newarray = ["aBC", "B"].collect do |e|
irb(main):037:1* e.downcase
irb(main):038:1> end
=> ["abc", "b"]

3. Messages and Methods
It can be hard to remember the difference between messages and methods. A message is a request sent from some sender object. When the receiver object receives the message, it looks to see whether it has a method with the same name. If so, the Ruby code within the method is run, and the results are returned to the sender. The message is the request; the method fulfills it.
呃,还是没有感性认识。

4. Delimiting Blocks
块的两种表示方式:
array.each do | element |
    puts element
end
array.each { | element |
    puts element
}
通常使用第一种,但可以用一行写成的情况也可以使用第二种:
array.each { | element | puts element }


posted @ 2007-06-14 14:02 ZelluX 阅读(337) | 评论 (0)编辑 收藏

     摘要: For using taglist plugin,you must install ctags plugin first.1.ctags (1)到http://ctags.sourceforge.net/下载ctags源码ctags-5.6.tar.gz http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gzwindows user ...  阅读全文

posted @ 2007-06-12 11:38 ZelluX 阅读(18303) | 评论 (0)编辑 收藏

Java跨平台的优势啊。。。

1. 把WinXP下的所有项目文件复制到Ubuntu下
2. 通过EMS导出数据库的sql文件,在Ubuntu下导入
3. 在Ubuntu下用MyEclipse加入该项目,重新设置引用的包的路径(包括数据库的配置)
4. 把所有包含中文的java源程序设置编码方式为GBK
5. 注意linux下的mysql是对大小写敏感的,因此原来windows下配置正确的Hibernate文件可能在linux下需要修改
6. 部署,enjoy

posted @ 2007-06-12 11:17 ZelluX 阅读(296) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 21 22 23 24 25 26 27 28 29 下一页 Last