|
很简短,有点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);
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; }
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, -1, 0, 1}; const int dy[] = {-1, 0, 1, 0};
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; }
在水源上看到的,大概的做法是 求前n项和序列S1, S2, ..., Sn,问题即转化为求i, j,使得Si - Sj = X 把{Sk}和{Sk + X}序列中的数都放入hash表中,查找冲突项。
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");
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参考手册了。花钱去买中文版我个人觉得不是很有必要,总共四部分中,前两部分我觉得蛮鸡肋的,第四部分在电脑上查更方便,只有第三部分有较高的价值。
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"
先把各种热门的东西都走马观花地看一遍,呵呵。 看的是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 }
摘要: 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 ... 阅读全文
Java跨平台的优势啊。。。
1. 把WinXP下的所有项目文件复制到Ubuntu下 2. 通过EMS导出数据库的sql文件,在Ubuntu下导入 3. 在Ubuntu下用MyEclipse加入该项目,重新设置引用的包的路径(包括数据库的配置) 4. 把所有包含中文的java源程序设置编码方式为GBK 5. 注意linux下的mysql是对大小写敏感的,因此原来windows下配置正确的Hibernate文件可能在linux下需要修改 6. 部署,enjoy
|