-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
554 lines (307 loc) · 172 KB
/
atom.xml
File metadata and controls
554 lines (307 loc) · 172 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Hexo</title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2018-04-29T14:47:32.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>John Doe</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>解决用Eclipse EE写JSP代码时,自动括号补全问题</title>
<link href="http://yoursite.com/2017/11/18/2017-11-18-%E8%A7%A3%E5%86%B3%E7%94%A8Eclipse-EE%E5%86%99JSP%E4%BB%A3%E7%A0%81%E6%97%B6%EF%BC%8C%E8%87%AA%E5%8A%A8%E6%8B%AC%E5%8F%B7%E8%A1%A5%E5%85%A8%E9%97%AE%E9%A2%98/"/>
<id>http://yoursite.com/2017/11/18/2017-11-18-解决用Eclipse-EE写JSP代码时,自动括号补全问题/</id>
<published>2017-11-18T06:43:00.000Z</published>
<updated>2018-04-29T14:47:32.000Z</updated>
<content type="html"><![CDATA[<p>这个问题其实是烦恼了挺久的,就我本人而言,通常不用括号补全,我觉得手打比较完整,在学JSP以前,用Eclipse虽然他带括号补全,但是也不影响手打,比如打括号时,不会出现三个括号。<br>而JSP的Editor就比较烦人了。比如打<%%>会出现<%%>>。</p><p>找了许久,解决办法如下Window->Preferences->Web->JSP Files->Editor->Typing<br><img src="/images/2017-11-18/2017-11-18_144337.png" alt=""></p><p>然后把Automatically close下面的勾全部取消,然后Apply。</p>]]></content>
<summary type="html">
<p>这个问题其实是烦恼了挺久的,就我本人而言,通常不用括号补全,我觉得手打比较完整,在学JSP以前,用Eclipse虽然他带括号补全,但是也不影响手打,比如打括号时,不会出现三个括号。<br>而JSP的Editor就比较烦人了。比如打&lt;%%&gt;会出现&lt;%%&gt
</summary>
<category term="学习" scheme="http://yoursite.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="日常配置" scheme="http://yoursite.com/tags/%E6%97%A5%E5%B8%B8%E9%85%8D%E7%BD%AE/"/>
<category term="Java" scheme="http://yoursite.com/tags/Java/"/>
</entry>
<entry>
<title>Ubuntu 16.04 菜单栏消失的解决办法</title>
<link href="http://yoursite.com/2017/09/17/2017-09-17-Ubuntu-16-04-%E8%8F%9C%E5%8D%95%E6%A0%8F%E6%B6%88%E5%A4%B1%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/"/>
<id>http://yoursite.com/2017/09/17/2017-09-17-Ubuntu-16-04-菜单栏消失的解决办法/</id>
<published>2017-09-17T01:33:00.000Z</published>
<updated>2018-04-29T14:44:05.000Z</updated>
<content type="html"><![CDATA[<p>今天无缘无故,ubuntu的菜单栏就消失了。找了以下终于找到了解决办法。</p><p>打开命令行窗口,输入以下语句:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dconf reset -f /org/compiz/</span><br><span class="line">setsid unity</span><br></pre></td></tr></table></figure></p><p>然后,菜单栏就回来了。</p>]]></content>
<summary type="html">
<p>今天无缘无故,ubuntu的菜单栏就消失了。找了以下终于找到了解决办法。</p>
<p>打开命令行窗口,输入以下语句:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span cl
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="Ubuntu" scheme="http://yoursite.com/tags/Ubuntu/"/>
<category term="折腾" scheme="http://yoursite.com/tags/%E6%8A%98%E8%85%BE/"/>
</entry>
<entry>
<title>ubuntu中Codeblock运行中文乱码解决方法</title>
<link href="http://yoursite.com/2017/09/16/2017-09-16-ubuntu%E4%B8%ADCodeblock%E8%BF%90%E8%A1%8C%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/"/>
<id>http://yoursite.com/2017/09/16/2017-09-16-ubuntu中Codeblock运行中文乱码解决方法/</id>
<published>2017-09-16T11:09:00.000Z</published>
<updated>2018-04-29T14:40:43.000Z</updated>
<content type="html"><![CDATA[<h3 id="中文乱码解决方案"><a href="#中文乱码解决方案" class="headerlink" title="中文乱码解决方案"></a>中文乱码解决方案</h3><p>“设置”菜单下选“环境设置”:</p><p>“常规设置”,最下面”启动控制台程序的终端”,选择gnome-terminal -t $TITLE -x<br>原来是xterm -T $TITLE –e</p><p>原地址:<br><a href="http://www.cnblogs.com/ttrrpp/p/6909784.html" target="_blank" rel="noopener">Ubuntu安装codeblocks 汉化 中文乱码 颜色主题 中文显示不全</a></p>]]></content>
<summary type="html">
<h3 id="中文乱码解决方案"><a href="#中文乱码解决方案" class="headerlink" title="中文乱码解决方案"></a>中文乱码解决方案</h3><p>“设置”菜单下选“环境设置”:</p>
<p>“常规设置”,最下面”启动控制台程序的终端”,
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="日常配置" scheme="http://yoursite.com/tags/%E6%97%A5%E5%B8%B8%E9%85%8D%E7%BD%AE/"/>
<category term="Ubuntu" scheme="http://yoursite.com/tags/Ubuntu/"/>
</entry>
<entry>
<title>解决Ubuntu“下载额外数据文件失败 ttf-mscorefonts-installer”的问题</title>
<link href="http://yoursite.com/2017/09/15/2017-09-15-%E8%A7%A3%E5%86%B3Ubuntu%E2%80%9C%E4%B8%8B%E8%BD%BD%E9%A2%9D%E5%A4%96%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E5%A4%B1%E8%B4%A5-ttf-mscorefonts-installer%E2%80%9D%E7%9A%84%E9%97%AE%E9%A2%98/"/>
<id>http://yoursite.com/2017/09/15/2017-09-15-解决Ubuntu“下载额外数据文件失败-ttf-mscorefonts-installer”的问题/</id>
<published>2017-09-15T05:37:00.000Z</published>
<updated>2018-04-29T14:35:10.000Z</updated>
<content type="html"><![CDATA[<p>最近开机总是遇到一段提示,内容大概是这样:</p><blockquote><p>下载额外数据文件失败<br>以下软件包要求安装后下载附加数据,但其数据无法下载或无法处理。<br>ttf-mscorefonts-installer<br>稍后系统将自动重试下载,您也可以手工立即重试。执行此命令需要有活动的网络连接。</p></blockquote><p>开始也挺烦恼,总是解决不掉。</p><p>后台发现<code>/usr/share/package-data-downloads</code>有一个文件<code>ttf-mscorefonts-installer</code>,用<code>gedit</code>打开,有一大串地址。<br>其实解决办法是,手动把这些地址链接的文件下载下来,然后放到一个文件夹中。</p><p>如果懒得下载,也可以使用已下载好的文件,百度网盘: <a href="https://pan.baidu.com/s/1jIcfEMa" target="_blank" rel="noopener">https://pan.baidu.com/s/1jIcfEMa</a> 密码: rbeh</p><p>手动在命令行执行<code>sudo dpkg-reconfigure ttf-mscorefonts-installer</code>这条语句手动指定文件夹的位置,重新配置下。</p><p>注意:在命令行不支持用鼠标点击,如果移动请使用tab键。</p><p>然后输入以下命令<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /usr/share/package-data-downloads/</span><br><span class="line">sudo rm ttf-mscorefonts-installer</span><br><span class="line"><span class="built_in">cd</span> /var/lib/update-notifier/package-data-downloads/</span><br><span class="line">sudo rm ttf-mscorefonts-installer</span><br><span class="line"><span class="built_in">cd</span> /var/lib/update-notifier/user.d/</span><br><span class="line">sudo rm data-downloads-failed</span><br></pre></td></tr></table></figure></p><p>重启后应该就没有烦人的提示了。</p>]]></content>
<summary type="html">
<p>最近开机总是遇到一段提示,内容大概是这样:</p>
<blockquote>
<p>下载额外数据文件失败<br>以下软件包要求安装后下载附加数据,但其数据无法下载或无法处理。<br>ttf-mscorefonts-installer<br>稍后系统将自动重试下载,您也可以手
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="Ubuntu" scheme="http://yoursite.com/tags/Ubuntu/"/>
<category term="折腾" scheme="http://yoursite.com/tags/%E6%8A%98%E8%85%BE/"/>
</entry>
<entry>
<title>Eclipse Neon配置Mysql</title>
<link href="http://yoursite.com/2017/06/15/2017-06-15-Eclipse-Neon%E9%85%8D%E7%BD%AEMysql/"/>
<id>http://yoursite.com/2017/06/15/2017-06-15-Eclipse-Neon配置Mysql/</id>
<published>2017-06-15T08:13:00.000Z</published>
<updated>2018-04-29T14:21:16.000Z</updated>
<content type="html"><![CDATA[<h3 id="1-要下载的资料"><a href="#1-要下载的资料" class="headerlink" title="1# 要下载的资料"></a>1# 要下载的资料</h3><p>MySQL Connector/J 6.0<br>下载网址:<a href="https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-6.0.6.zip" target="_blank" rel="noopener">https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-6.0.6.zip</a><br>查看最新版本下载链接:<a href="https://dev.mysql.com/downloads/connector/j/" target="_blank" rel="noopener">https://dev.mysql.com/downloads/connector/j/</a></p><h3 id="2-解压文件"><a href="#2-解压文件" class="headerlink" title="2# 解压文件"></a>2# 解压文件</h3><p>解压mysql-connector-java-6.0.6.zip,可得如下文件:<br><img src="/images/2017-06-15/63546416.png" alt=""></p><h3 id="3-放置文件"><a href="#3-放置文件" class="headerlink" title="3# 放置文件"></a>3# 放置文件</h3><p>假如在D盘创建一个文件夹java,然后在java文件夹里面创建jdbc-drivers文件夹,将mysql-connector-java-6.0.6-bin.jar放入此文件夹。<br>可以得到此文件的路径,记住这个文件的位置,下面还需要用到。<br>D:\java\jdbc-drivers\mysql-connector-java-6.0.6-bin.jar<br>其实文件路径是随意的,放在一个可以找得到的文件夹就可以了。</p><h3 id="4-在Eclipse上配置mysql库文件"><a href="#4-在Eclipse上配置mysql库文件" class="headerlink" title="4# 在Eclipse上配置mysql库文件"></a>4# 在Eclipse上配置mysql库文件</h3><p>打开Eclipse在菜单里找到Window–>Preferences打开<br><img src="/images/2017-06-15/456465464.png" alt=""></p><p>在设置界面里面找到Java–>Build Path–>User Libraries,打开如图所示:<br><img src="/images/2017-06-15/654646416.png" alt=""></p><p>点击New新建,在输入框输入jdbc,然后下面的System library勾上。<br><img src="/images/2017-06-15/41654164164.png" alt=""></p><h3 id="5-导入jar包"><a href="#5-导入jar包" class="headerlink" title="5# 导入jar包"></a>5# 导入jar包</h3><p>接下类点击Add External JARs,将刚才的mysql-connector-java-6.0.6-bin.jar这个文件选中,然后最后OK保存设置就可以了。<br><img src="/images/2017-06-15/QQ截图20170615160713.png" alt=""></p><p>6# 在Eclipse项目上使用Mysql库文件<br>在项目上右键弹出菜单选择Build Path然后选择Add Libraries<br><img src="/images/2017-06-15/54654641648.png" alt=""></p><p>然后在弹出的选项中选则,User Libraries,接着勾选jdbc这个库,最后点Finsh完成就可以成功在项目中使用mysql进行连接数据库了。<br><img src="/images/2017-06-15/QQ截图20170615160845.png" alt=""></p><h3 id="7-测试运行"><a href="#7-测试运行" class="headerlink" title="7# 测试运行"></a>7# 测试运行</h3><p><img src="/images/2017-06-15/4998749464697.png" alt=""></p><p>注意:6.0版本的MySQL Connector/J 6.0与之前的版本有很大区别,不兼容。</p><p>可以查看官方文档:<a href="https://dev.mysql.com/doc/connector-j/6.0/en/" target="_blank" rel="noopener">https://dev.mysql.com/doc/connector-j/6.0/en/</a></p>]]></content>
<summary type="html">
<h3 id="1-要下载的资料"><a href="#1-要下载的资料" class="headerlink" title="1# 要下载的资料"></a>1# 要下载的资料</h3><p>MySQL Connector/J 6.0<br>下载网址:<a href="https
</summary>
<category term="学习" scheme="http://yoursite.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="日常配置" scheme="http://yoursite.com/tags/%E6%97%A5%E5%B8%B8%E9%85%8D%E7%BD%AE/"/>
<category term="Java" scheme="http://yoursite.com/tags/Java/"/>
</entry>
<entry>
<title>CodeBlocks 16.01+wxWidgets 3.03配置</title>
<link href="http://yoursite.com/2017/06/07/2017-06-07-CodeBlocks-16-01-wxWidgets-3-03%E9%85%8D%E7%BD%AE/"/>
<id>http://yoursite.com/2017/06/07/2017-06-07-CodeBlocks-16-01-wxWidgets-3-03配置/</id>
<published>2017-06-06T17:35:00.000Z</published>
<updated>2018-04-29T14:53:49.000Z</updated>
<content type="html"><![CDATA[<h3 id="1-下载CodeBlocks-16-01和wxWidgets-3-0-3"><a href="#1-下载CodeBlocks-16-01和wxWidgets-3-0-3" class="headerlink" title="1# 下载CodeBlocks 16.01和wxWidgets 3.0.3"></a>1# 下载CodeBlocks 16.01和wxWidgets 3.0.3</h3><p>CodeBlocks 16.01 下载地址:<a href="http://www.codeblocks.org/downloads/" target="_blank" rel="noopener">http://www.codeblocks.org/downloads/</a><br>wxWidgets 3.03 下载地址:<a href="https://www.wxwidgets.org/downloads/" target="_blank" rel="noopener">https://www.wxwidgets.org/downloads/</a></p><p>最新的wxWidgets 3.1.0 但是这里面没有使用这个版本的原因是CodeBlocks 16.01是2016.01发布的,而wxWidgets 3.1.0是2016.02发布的,这个版本的CodeBlocks没有集成3.10的配置。如果非要用也行,要改项目工程文件的配置。</p><p>下载后得到两个文件:</p><ul><li>codeblocks-16.01mingw-setup.exe</li><li>wxWidgets-3.0.3.zip</li></ul><h3 id="2-安装CodeBlocks-16-01和解压wxWidgets-3-0-3"><a href="#2-安装CodeBlocks-16-01和解压wxWidgets-3-0-3" class="headerlink" title="2# 安装CodeBlocks 16.01和解压wxWidgets 3.0.3"></a>2# 安装CodeBlocks 16.01和解压wxWidgets 3.0.3</h3><p>将CodeBlocks安装到F:\Program Files (x86)\CodeBlocks<br>将wxWidgets解压到F:\wxWidgets-3.0.3目录下<br><em>PS:其实这个随意,只要安装到找得到的地方就好。</em></p><h3 id="3-设置环境变量"><a href="#3-设置环境变量" class="headerlink" title="3# 设置环境变量"></a>3# 设置环境变量</h3><p>在编译wxWidgets之前首先要设置一下MinGw环境变量,CodeBlocks 16.01中有自带gcc 4.9.2 这个版本的编译器。比如我的CodeBlocks装在F:\Program Files (x86)\CodeBlocks这个目录下,那么将<code>;F:\Program Files (x86)\CodeBlocks\MinGW\bin;</code>加入Path路径中,保存。<em>注意:环境变量每个路径以分号分隔的,如果前面路径结尾已经有了分号,那么只需要一个分号。</em></p><p>在命令行下输入<code>gcc –v</code>有如下信息:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\Administrator>gcc -v</span><br><span class="line">Using built-in specs.</span><br><span class="line">COLLECT_GCC=gcc</span><br><span class="line">COLLECT_LTO_WRAPPER=F:/Program\ Files\ (x86)/CodeBlocks/MinGW/bin/../libexec/gcc</span><br><span class="line">/mingw32/4.9.2/lto-wrapper.exe</span><br><span class="line">Target: mingw32</span><br><span class="line">…</span><br><span class="line">Thread model: posix</span><br><span class="line">gcc version 4.9.2 (tdm-1)</span><br></pre></td></tr></table></figure></p><p>看最末尾那行gcc version是4.9.2那么就是成功配置了。wxWidgets对编译器的版本也有要求的,如果是新手,建议使用CodeBlocks自带的编译器。</p><h3 id="4-编译wxWidgets-3-0-3"><a href="#4-编译wxWidgets-3-0-3" class="headerlink" title="4# 编译wxWidgets 3.0.3"></a>4# 编译wxWidgets 3.0.3</h3><p>在命令进入wxWigets的build/msw文件夹,例如我的是F:\wxWidgets-3.0.3\build\msw这个路径<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">F:</span><br><span class="line"><span class="built_in">cd</span> F:\wxWidgets-3.0.3\build\msw</span><br></pre></td></tr></table></figure></p><p>接下来就是make了。</p><p>编译命令如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mingw32-make -j2 -f makefile.gcc BUILD=release SHARED=0 MONOLITHIC=1 UNICODE=1</span><br><span class="line">mingw32-make -j2 -f makefile.gcc BUILD=debug SHARED=0 MONOLITHIC=1 UNICODE=1</span><br></pre></td></tr></table></figure></p><p>这里使用开两个线程来编译,加入参数-j2,以加快速度,第一次运行会直接提示出错,再运行同样的命令一次就不会出问题了。当然如果不加-j2,也没问题,以正常的速度编译。值得一说的是,可以开两个命令行窗口同时编译,运行上面命令。比如一个窗口编译release版本,一个窗口编译debug版本。速度也能大大加快。</p><p>还有其他的一些参数解释如下:<br><strong>BUILD</strong><br>BUILD控制wxWidgets构建调试版本(BUILD=debug)或者是发布版本(BUILD=release)。绝大多数情况下你只需要 wxWidgets的发布版本就可以了,因为你应该不想要去调试wxWidgets自身,同时你依然可以通过链接wxWidgets的发布版本来构建你自己的程序的调试版本。</p><p><strong>SHARED</strong><br>SHARED控制wxWidgets是构建DLL(SHARED=1)还是静态库(SHARED=0)。利用构建的DLL,主程序构建时间较快,可执行文件更小。但是可执行文件加上wxWidgets DLL的总大小更大,但是不同的可执行文件可以使用同一个DLL。</p><p><strong>MONOLITHIC</strong><br>MONOLITHIC控制是构建一个单一的库(MONOLITHIC=1)还是多个组件库(MONOLITHIC=0)。使用单一构建,项目的设置 和开发会更加简单,如果你同时使用DLL构建的话,你只需要分发一个DLL文件。如果使用非单一构建(multilib),会构建出多个不同的库同时你可 以避免将整个wxWidgets的基本代码链接到主程序,就可以去掉不需要的库。同时你也必须确保你选择了正确的组件库。</p><p><strong>UNICODE</strong><br>UNICODE控制wxWidgets以及你的程序是否使用支持Unicode的宽字符串。</p><h3 id="5-配置CodeBlocks"><a href="#5-配置CodeBlocks" class="headerlink" title="5# 配置CodeBlocks"></a>5# 配置CodeBlocks</h3><p>编译好了以后还有在CodeBlocks上配置一下。<br>在<code>Settings-->Global Variable Editor上Current Variable</code>这个选项上New,输入wx。<br>然后设置下base、include和lib,例如我的wxWidgets安装位置是<code>F:\wxWidgets-3.0.3</code><br><img src="/images/2017-06-07/2017-06-06_222630.png" alt="" title="CodeBlcoks wxWidgets变量配置"></p><h3 id="6-进行测试"><a href="#6-进行测试" class="headerlink" title="6# 进行测试"></a>6# 进行测试</h3><p>下面是新建工程测试。<br>有一个事情是必须记住的,要记住编译时的参数。<br>上面的命令一共编译了两个版本,release和debug版,在构建项目的时候,两个都可以勾选。而且,SHARED=0代表使用静态库,Use wxWidgets DLL不勾选,MONOLITHIC=1 表示使用单一的库,wxWidgets is build as a monolithic library就要勾选,同理UNICODE=1表示支持Unicode,这样Enable unicode也要勾选。<br><img src="/images/2017-06-07/2017-06-07_005128.png" alt="" title="新建wxWidgets工程"></p><p><img src="/images/2017-06-07/2017-06-07_005316.png" alt="" title="设置wxWidgets工程名称和目录"></p><p><img src="/images/2017-06-07/2017-06-07_005403.png" alt="" title="设置作者信息"></p><p><img src="/images/2017-06-07/2017-06-07_005503.png" alt="" title="设置GUI类型"></p><p><img src="/images/2017-06-07/2017-06-07_005509.png" alt="" title="设置wx变量"></p><p><img src="/images/2017-06-07/2017-06-07_005519.png" alt="" title="设置编译选项,release和debug"></p><p><img src="/images/2017-06-07/2017-06-07_005531.png" alt="" title="设置wxWidgets编译时的一些参数"></p><p><img src="/images/2017-06-07/2017-06-07_005624-1024x656.png" alt="" title="测试"></p><h3 id="7-正常使用"><a href="#7-正常使用" class="headerlink" title="7# 正常使用"></a>7# 正常使用</h3><p>接下来可以随意使用了。</p>]]></content>
<summary type="html">
<h3 id="1-下载CodeBlocks-16-01和wxWidgets-3-0-3"><a href="#1-下载CodeBlocks-16-01和wxWidgets-3-0-3" class="headerlink" title="1# 下载CodeBlocks 16.0
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>Ubuntu 14.04/16.04 开启root用户登录/自动开启小键盘</title>
<link href="http://yoursite.com/2017/06/04/2017-06-04-Ubuntu-14-04-16-04-%E5%BC%80%E5%90%AFroot%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95-%E8%87%AA%E5%8A%A8%E5%BC%80%E5%90%AF%E5%B0%8F%E9%94%AE%E7%9B%98/"/>
<id>http://yoursite.com/2017/06/04/2017-06-04-Ubuntu-14-04-16-04-开启root用户登录-自动开启小键盘/</id>
<published>2017-06-04T04:06:00.000Z</published>
<updated>2018-04-29T14:15:14.000Z</updated>
<content type="html"><![CDATA[<h3 id="1-给root用户设置密码"><a href="#1-给root用户设置密码" class="headerlink" title="1# 给root用户设置密码"></a>1# 给root用户设置密码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo passwd root</span><br><span class="line">sudo apt-get install numlockx</span><br></pre></td></tr></table></figure><h3 id="2-使用命令行登录root"><a href="#2-使用命令行登录root" class="headerlink" title="2# 使用命令行登录root"></a>2# 使用命令行登录root</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">su -</span><br><span class="line">nautilus</span><br></pre></td></tr></table></figure><p>这样弹出来的文件管理器就有root权限了(当然只是临时的),为了方便改文件</p><h3 id="3-改文件"><a href="#3-改文件" class="headerlink" title="3# 改文件"></a>3# 改文件</h3><p>在<code>/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf</code>文件增加两行<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">greeter-show-manual-login=<span class="literal">true</span></span><br><span class="line">allow-guest=<span class="literal">false</span></span><br></pre></td></tr></table></figure></p><p>在<code>/usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf</code>文件增加一行<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">greeter-setup-script=/usr/bin/numlockx on</span><br></pre></td></tr></table></figure></p><h3 id="4-重启"><a href="#4-重启" class="headerlink" title="4# 重启"></a>4# 重启</h3><p>重启完以后就可以禁用guest账户和使用root登录了</p><h3 id="5-可能出现的问题"><a href="#5-可能出现的问题" class="headerlink" title="5# 可能出现的问题"></a>5# 可能出现的问题</h3><p>使用root用户登录可能会出现Error found when loading /root/.profile stdin: is not a tty这样的错误</p><p>解决办法如下:<br>修改<code>/root/.profile</code>文件,在文件管理器中设置 编辑–首选项 勾选 显示隐藏和备份文件 就可以查看这个文件,用vi修改也行。把<code>mesg n</code>进行注释,增加一行<code>tty -s && mesg n</code>保存,注销后重新登录问题解决。</p>]]></content>
<summary type="html">
<h3 id="1-给root用户设置密码"><a href="#1-给root用户设置密码" class="headerlink" title="1# 给root用户设置密码"></a>1# 给root用户设置密码</h3><figure class="highlight ba
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="Ubuntu" scheme="http://yoursite.com/tags/Ubuntu/"/>
<category term="折腾" scheme="http://yoursite.com/tags/%E6%8A%98%E8%85%BE/"/>
</entry>
<entry>
<title>使用OpenVPN对校园网内网穿透</title>
<link href="http://yoursite.com/2017/04/22/2017-04-22-%E4%BD%BF%E7%94%A8OpenVPN%E5%AF%B9%E6%A0%A1%E5%9B%AD%E7%BD%91%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"/>
<id>http://yoursite.com/2017/04/22/2017-04-22-使用OpenVPN对校园网内网穿透/</id>
<published>2017-04-22T13:54:00.000Z</published>
<updated>2018-04-29T13:11:13.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>目标: 搭建完成之后,可以在服务器(外网)上直接输入校园网(内网)地址进行访问。<br><img src="/images/2017-04-22/OpenVPN.png" alt=""></p></blockquote><h3 id="00-前言"><a href="#00-前言" class="headerlink" title="#00 前言"></a>#00 前言</h3><p>最近对穿透学校的内网有需求,于是决定搭建环境。<br>网上的教程大多都是客户端访问服务器的内网,<br>但这个教程是,穿透客户端所在内网,由服务器访问客户端的内网。</p><p><strong>服务器IP</strong>:x.x.x.x<br><strong>客户端IP</strong>:192.168.1.1 所在网段 192.168.1.0/24<br><strong>学校内网网段</strong>:10.20.208.0/24</p><p>路由器通过学校内网IP上网,此处省去路由端802.1X的认证过程,假设直接就能通过学校的认证并且获取到一个ip。</p><p>在路由器上是可以直接访问10.20.208.0/24网段的,但是10.20.208.x是一个内网的地址,服务器所在环境是外网无法访问。</p><p><em>如果是对内网的某一个某个网站进行穿透,建议使用ngrok</em>,这里是对整个网段的穿透。</p><h3 id="01-OpenVPN-Server和Client所用的环境"><a href="#01-OpenVPN-Server和Client所用的环境" class="headerlink" title="#01 OpenVPN Server和Client所用的环境"></a>#01 OpenVPN Server和Client所用的环境</h3><ul><li>OpenVpn Sever使用的服务器(CentOS 7.0)</li><li>OpenVpn Client放在Openwrt(Pandorabox 16.10 stable, Openwrt 17.01)路由器上运行</li></ul><h3 id="02-安装OpenVPN-服务器端"><a href="#02-安装OpenVPN-服务器端" class="headerlink" title="#02 安装OpenVPN(服务器端)"></a>#02 安装OpenVPN(服务器端)</h3><p>登录服务器端,输入以下命令进行openvpn的安装<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y openvpn</span><br></pre></td></tr></table></figure></p><p>或者是到openvpn的官方网站下载源码 <a href="https://openvpn.net/index.php/open-source/downloads.html" target="_blank" rel="noopener">https://openvpn.net/index.php/open-source/downloads.html</a><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.1.tar.gz</span><br></pre></td></tr></table></figure></p><p>然后按照下面的命令进行安装<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">tar -zxf openvpn-2.4.1.tar.gz</span><br><span class="line"><span class="built_in">cd</span> openvpn-2.4.1</span><br><span class="line">./configure</span><br><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure></p><p>安装完成openvpn之后,输入以下命令就可看到版本信息<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">openvpn --version</span><br><span class="line">OpenVPN 2.4.1 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 3 2017</span><br><span class="line">library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06</span><br><span class="line">Originally developed by James Yonan</span><br><span class="line">Copyright (C) 2002-2017 OpenVPN Technologies, Inc. <sales@openvpn.net></span><br><span class="line">......</span><br></pre></td></tr></table></figure></p><h3 id="03-下载easy-rsa"><a href="#03-下载easy-rsa" class="headerlink" title="#03 下载easy-rsa"></a>#03 下载easy-rsa</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">wget -c https://github.com/OpenVPN/easy-rsa/archive/master.zip</span><br><span class="line">unzip master.zip</span><br><span class="line">mv easy-rsa-master easy-rsa</span><br><span class="line">cp -rf easy-rsa /etc/openvpn</span><br><span class="line"><span class="built_in">cd</span> /etc/openvpn/easy-rsa</span><br><span class="line"><span class="built_in">cd</span> /etc/openvpn/easy-rsa/easyrsa3</span><br><span class="line">mv vars.example vars</span><br></pre></td></tr></table></figure><p>解除注释之后,修改如下内容(填写自己的信息):<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">vi vars</span><br><span class="line">set_var EASYRSA_REQ_COUNTRY <span class="string">"CN"</span></span><br><span class="line">set_var EASYRSA_REQ_PROVINCE <span class="string">"Guangdong"</span></span><br><span class="line">set_var EASYRSA_REQ_CITY <span class="string">"Dongguan"</span></span><br><span class="line">set_var EASYRSA_REQ_ORG <span class="string">"DotTimes Co"</span></span><br><span class="line">set_var EASYRSA_REQ_EMAIL <span class="string">"xxx@xxxx.com"</span></span><br><span class="line">set_var EASYRSA_REQ_OU <span class="string">"Zeyes"</span></span><br></pre></td></tr></table></figure></p><p>修改完之后,按下ESC,然后输入<code>:wq</code>保存</p><h3 id="04-配置证书文件"><a href="#04-配置证书文件" class="headerlink" title="#04 配置证书文件"></a>#04 配置证书文件</h3><h4 id="1-初始化配置"><a href="#1-初始化配置" class="headerlink" title="1. 初始化配置"></a>1. 初始化配置</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./easyrsa init-pki</span><br></pre></td></tr></table></figure><p>如果成功的话,会在当前目录下创建pki/{reqs,private}目录,用于保存证书文件。</p><h4 id="2-创建根证书"><a href="#2-创建根证书" class="headerlink" title="2. 创建根证书"></a>2. 创建根证书</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./easyrsa build-ca</span><br></pre></td></tr></table></figure><p>创建过程中需要输入根证书的密码以及<code>Common Name</code>。如果创建成功,则会在<code>pki/private/</code>目录下创建<code>ca.key</code>私钥文件以及<code>pki/</code>目录下创建<code>ca.crt</code>证书文件。</p><h4 id="3-创建服务器证书"><a href="#3-创建服务器证书" class="headerlink" title="3. 创建服务器证书"></a>3. 创建服务器证书</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./easyrsa build-server-full server nopass</span><br></pre></td></tr></table></figure><p>创建过程和根证书创建类似,需要输入证书的密码以及上一个步骤创建根证书的密码。<br>如果创建成功,则会在<code>pki/private</code>目录创建<code>server.key</code>私钥文件。在<code>pki/issued</code>目录创建<code>server.crt</code>证书文件。</p><h4 id="4-创建dh证书"><a href="#4-创建dh证书" class="headerlink" title="4. 创建dh证书"></a>4. 创建dh证书</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./easyrsa gen-dh</span><br></pre></td></tr></table></figure><p>DH parameters of size 2048 created at /usr/local/easy-rsa-master/easyrsa3/pki/dh.pem</p><h4 id="5-创建客户端证书"><a href="#5-创建客户端证书" class="headerlink" title="5. 创建客户端证书"></a>5. 创建客户端证书</h4><p>./easyrsa build-client-full openwrt nopass # openwrt是用户名,也可以输入其他的, nopass表示不需要密码<br>创建过程要输入ca证书的密码(第2步的密码)</p><h4 id="6-server端的文件,复制到-etc-openvpn-下"><a href="#6-server端的文件,复制到-etc-openvpn-下" class="headerlink" title="6. server端的文件,复制到/etc/openvpn/下"></a>6. server端的文件,复制到/etc/openvpn/下</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /etc/openvpn/</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt .</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt .</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key .</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem ./dh2048.pem</span><br></pre></td></tr></table></figure><h4 id="7-client端的文件-然后下载-放到一个可以下载的地方,注意权限"><a href="#7-client端的文件-然后下载-放到一个可以下载的地方,注意权限" class="headerlink" title="7. client端的文件, 然后下载 (放到一个可以下载的地方,注意权限)"></a>7. client端的文件, 然后下载 (放到一个可以下载的地方,注意权限)</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /data/wwwroot/default/</span><br><span class="line">mkdir client</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt ./client/</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/openwrt.crt ./client/</span><br><span class="line">cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/openwrt.key ./client/</span><br><span class="line">chown -R www.www client</span><br><span class="line">chmod 644 ./client/*</span><br></pre></td></tr></table></figure><p>我这里是放在服务器网站目录下,如果有其他选择,可以选择其他方便进行下载的地方</p><h3 id="05-配置OpenVPN-Server"><a href="#05-配置OpenVPN-Server" class="headerlink" title="#05 配置OpenVPN Server"></a>#05 配置OpenVPN Server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /etc/openvpn</span><br></pre></td></tr></table></figure><h4 id="1-将server配置模板复制到-etc-openvpn下"><a href="#1-将server配置模板复制到-etc-openvpn下" class="headerlink" title="1. 将server配置模板复制到/etc/openvpn下"></a>1. 将server配置模板复制到/etc/openvpn下</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp /usr/share/doc/openvpn-2.4.1/sample/sample-config-files/server.conf .</span><br></pre></td></tr></table></figure><h4 id="2-编辑server-conf"><a href="#2-编辑server-conf" class="headerlink" title="2. 编辑server.conf"></a>2. 编辑server.conf</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">vi server.conf</span><br><span class="line"></span><br><span class="line"><span class="built_in">local</span> xxx.xxx.xxx.xxx <span class="comment"># 这里填服务器的外网ip</span></span><br><span class="line">port 1194</span><br><span class="line">proto udp</span><br><span class="line">dev tun</span><br><span class="line">ca ca.crt</span><br><span class="line">cert server.crt</span><br><span class="line">key server.key</span><br><span class="line">dh dh2048.pem</span><br><span class="line">server 10.8.0.0 255.255.255.0</span><br><span class="line">ifconfig-pool-persist ipp.txt</span><br><span class="line">client-config-dir ccd</span><br><span class="line">route 10.20.208.0 255.255.255.0 <span class="comment"># 学校内网网段</span></span><br><span class="line">route 192.168.1.0 255.255.255.0 <span class="comment"># 路由器网段</span></span><br><span class="line">client-to-client</span><br><span class="line">keepalive 10 120</span><br><span class="line">;tls-auth ta.key 0</span><br><span class="line">cipher AES-256-CBC <span class="comment"># 加密方式</span></span><br><span class="line">comp-lzo</span><br><span class="line">;user nobody</span><br><span class="line">;group nobody</span><br><span class="line">persist-key</span><br><span class="line">persist-tun</span><br><span class="line">status openvpn-status.log</span><br><span class="line">verb 3</span><br><span class="line">explicit-exit-notify 1</span><br></pre></td></tr></table></figure><h3 id="06-配置ccd文件夹"><a href="#06-配置ccd文件夹" class="headerlink" title="#06 配置ccd文件夹"></a>#06 配置ccd文件夹</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /etc/openvpn</span><br><span class="line">mkdir ccd</span><br><span class="line"><span class="built_in">cd</span> ccd</span><br><span class="line">vi openwrt <span class="comment"># 填你的生成的客户端证书名</span></span><br><span class="line">iroute 10.20.208.0 255.255.255.0 <span class="comment"># 学校内网网段</span></span><br><span class="line">iroute 192.168.1.0 255.255.255.0 <span class="comment"># 路由器网段</span></span><br><span class="line">ifconfig-push 10.8.0.2 10.8.0.1</span><br></pre></td></tr></table></figure><h3 id="07-iptables-设置(根据实际情况)"><a href="#07-iptables-设置(根据实际情况)" class="headerlink" title="#07 iptables 设置(根据实际情况)"></a>#07 iptables 设置(根据实际情况)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">yum install -y iptables-services</span><br><span class="line">systemctl <span class="built_in">enable</span> iptables</span><br><span class="line">systemctl stop firewalld</span><br><span class="line">systemctl start iptables</span><br><span class="line">iptables -L -n</span><br><span class="line">iptables -P INPUT ACCEPT</span><br><span class="line">iptables -F</span><br><span class="line">iptables -X</span><br><span class="line">iptables -A INPUT -i lo -j ACCEPT</span><br><span class="line">iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</span><br><span class="line">iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT</span><br><span class="line">iptables -A INPUT -p tcp --dport 22 -j ACCEPT</span><br><span class="line">iptables -A INPUT -p tcp --dport 21 -j ACCEPT</span><br><span class="line">iptables -A INPUT -p tcp --dport 443 -j ACCEPT</span><br><span class="line">iptables -A INPUT -p tcp --dport 80 -j ACCEPT</span><br><span class="line">iptables -A INPUT -p tcp --dport 3306 -j ACCEPT</span><br><span class="line">iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o tun+ -j MASQUERADE</span><br><span class="line">iptables -t nat -A POSTROUTING -s 10.20.208.0/24 -o tun+ -j MASQUERADE</span><br><span class="line">iptables -A FORWARD -d 10.20.208.0/24 -o tun+ -j ACCEPT</span><br><span class="line">service iptables save</span><br><span class="line">service iptables restart</span><br></pre></td></tr></table></figure><h3 id="08-服务器设置"><a href="#08-服务器设置" class="headerlink" title="#08 服务器设置"></a>#08 服务器设置</h3><h4 id="1-设置允许转发"><a href="#1-设置允许转发" class="headerlink" title="1. 设置允许转发"></a>1. 设置允许转发</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/sysctl.conf</span><br><span class="line">net.ipv4.ip_forward = 1</span><br><span class="line">sysctl -p <span class="comment"># 立即生效</span></span><br></pre></td></tr></table></figure><h4 id="2-设置openvpn开机启动"><a href="#2-设置openvpn开机启动" class="headerlink" title="2. 设置openvpn开机启动"></a>2. 设置openvpn开机启动</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">systemctl -f <span class="built_in">enable</span> openvpn@server.service</span><br><span class="line">systemctl start openvpn@server.service</span><br><span class="line">systemctl restart openvpn@server.service</span><br></pre></td></tr></table></figure><h3 id="09-下载证书"><a href="#09-下载证书" class="headerlink" title="#09 下载证书"></a>#09 下载证书</h3><p>总共有三个文件</p><ul><li>ca.crt</li><li>openwrt.crt</li><li>openwrt.key</li></ul><h3 id="10-客户端设置-Pandorabox-Openwrt-17-01"><a href="#10-客户端设置-Pandorabox-Openwrt-17-01" class="headerlink" title="#10 客户端设置(Pandorabox, Openwrt 17.01)"></a>#10 客户端设置(Pandorabox, Openwrt 17.01)</h3><h4 id="1-安装openvpn以及luci-web配置界面还有中文"><a href="#1-安装openvpn以及luci-web配置界面还有中文" class="headerlink" title="1. 安装openvpn以及luci web配置界面还有中文"></a>1. 安装openvpn以及luci web配置界面还有中文</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">opkg update</span><br><span class="line">opkg install openvpn-openssl</span><br><span class="line">opkg install luci-app-openvpn</span><br><span class="line">opkg install luci-i18n-openvpn-zh-cn</span><br></pre></td></tr></table></figure><h4 id="2-设置允许转发"><a href="#2-设置允许转发" class="headerlink" title="2. 设置允许转发"></a>2. 设置允许转发</h4><p>默认情况下,防火墙是禁止转发的。<br>所以登录路由器的web设置界面luci, 找到网络-防火墙-一般设置,<br>可以看到转发是拒绝的,把转发设置成接受,然后点击保存并应用。</p><h3 id="11-测试OpenVPN-客户端-能否正常运行(此步可以省略)"><a href="#11-测试OpenVPN-客户端-能否正常运行(此步可以省略)" class="headerlink" title="#11 测试OpenVPN(客户端)能否正常运行(此步可以省略)"></a>#11 测试OpenVPN(客户端)能否正常运行(此步可以省略)</h3><h4 id="1-预先编辑好文件client-conf,然后传到-tmp目录,文件内容如下:"><a href="#1-预先编辑好文件client-conf,然后传到-tmp目录,文件内容如下:" class="headerlink" title="1. 预先编辑好文件client.conf,然后传到/tmp目录,文件内容如下:"></a>1. 预先编辑好文件client.conf,然后传到/tmp目录,文件内容如下:</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">client</span><br><span class="line">;dev tap</span><br><span class="line">dev tun</span><br><span class="line">;dev-node MyTap</span><br><span class="line">;proto tcp</span><br><span class="line">proto udp</span><br><span class="line">remote x.x.x.x 1194 <span class="comment"># 这里修改为你的服务器ip</span></span><br><span class="line">;remote my-server-2 1194</span><br><span class="line">;remote-random</span><br><span class="line">resolv-retry infinite</span><br><span class="line">nobind</span><br><span class="line">;user nobody</span><br><span class="line">;group nobody</span><br><span class="line">persist-key</span><br><span class="line">persist-tun</span><br><span class="line">;http-proxy-retry <span class="comment"># retry on connection failures</span></span><br><span class="line">;http-proxy [proxy server] [proxy port <span class="comment">#]</span></span><br><span class="line">;mute-replay-warnings</span><br><span class="line">ca ca.crt</span><br><span class="line">cert openwrt.crt</span><br><span class="line">key openwrt.key</span><br><span class="line">remote-cert-tls server</span><br><span class="line">;tls-auth ta.key 1</span><br><span class="line">cipher AES-256-CBC</span><br><span class="line">comp-lzo</span><br><span class="line">verb 3</span><br><span class="line">;mute 20</span><br></pre></td></tr></table></figure><h4 id="2-测试运行,如果不成功会有提示"><a href="#2-测试运行,如果不成功会有提示" class="headerlink" title="2. 测试运行,如果不成功会有提示"></a>2. 测试运行,如果不成功会有提示</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openvpn --config client.conf</span><br></pre></td></tr></table></figure><h4 id="3-在服务器端输入以下命令测试"><a href="#3-在服务器端输入以下命令测试" class="headerlink" title="3. 在服务器端输入以下命令测试"></a>3. 在服务器端输入以下命令测试</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ping 10.8.0.2 -c 4</span><br><span class="line">ping 192.168.1.1 -c 4</span><br><span class="line">ping 10.20.208.12 -c 4</span><br></pre></td></tr></table></figure><p>如果能够正常运行,说明客户端和配置都没有问题</p><h3 id="11-配置OpenVPN-Client"><a href="#11-配置OpenVPN-Client" class="headerlink" title="#11 配置OpenVPN Client"></a>#11 配置OpenVPN Client</h3><h4 id="1-使用scp,把证书传到-etc-luci-uploads-文件夹-没有就创建-传好后目录内容如下:"><a href="#1-使用scp,把证书传到-etc-luci-uploads-文件夹-没有就创建-传好后目录内容如下:" class="headerlink" title="1. 使用scp,把证书传到/etc/luci-uploads/文件夹(没有就创建), 传好后目录内容如下:"></a>1. 使用scp,把证书传到/etc/luci-uploads/文件夹(没有就创建), 传好后目录内容如下:</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/etc/luci-uploads/ca.crt</span><br><span class="line">/etc/luci-uploads/openwrt.crt</span><br><span class="line">/etc/luci-uploads/openwrt.key</span><br></pre></td></tr></table></figure><h4 id="2-登录ssh,编辑openvpn配置文件"><a href="#2-登录ssh,编辑openvpn配置文件" class="headerlink" title="2. 登录ssh,编辑openvpn配置文件"></a>2. 登录ssh,编辑openvpn配置文件</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/config/openvpn</span><br></pre></td></tr></table></figure><p>把以下内容添加到最后面,并保存<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">config openvpn <span class="string">'openwrt'</span></span><br><span class="line">option enabled <span class="string">'1'</span></span><br><span class="line">option <span class="built_in">float</span> <span class="string">'1'</span></span><br><span class="line">option client <span class="string">'1'</span></span><br><span class="line">option nobind <span class="string">'1'</span></span><br><span class="line">option comp_lzo <span class="string">'yes'</span></span><br><span class="line">option reneg_sec <span class="string">'0'</span></span><br><span class="line">option dev <span class="string">'tun'</span></span><br><span class="line">option verb <span class="string">'3'</span></span><br><span class="line">option persist_tun <span class="string">'1'</span></span><br><span class="line">option persist_key <span class="string">'1'</span></span><br><span class="line">option remote_cert_tls <span class="string">'server'</span></span><br><span class="line">list remote <span class="string">'x.x.x.x 1194'</span> <span class="comment"># 此处要设置成服务器的地址</span></span><br><span class="line">option ca <span class="string">'/etc/luci-uploads/ca.crt'</span></span><br><span class="line">option cert <span class="string">'/etc/luci-uploads/openwrt.crt'</span></span><br><span class="line">option key <span class="string">'/etc/luci-uploads/openwrt.key'</span></span><br><span class="line">option resolv_retry <span class="string">'infinite'</span></span><br><span class="line">option keepalive <span class="string">'10 120'</span></span><br><span class="line">option <span class="built_in">log</span> <span class="string">'/tmp/openvpn.log'</span></span><br><span class="line">option log_append <span class="string">'/tmp/openvpn.log'</span></span><br><span class="line">option cipher <span class="string">'AES-256-CBC'</span></span><br></pre></td></tr></table></figure></p><h3 id="12-启动Openvpn-Client"><a href="#12-启动Openvpn-Client" class="headerlink" title="#12 启动Openvpn Client"></a>#12 启动Openvpn Client</h3><p>登录openwrt的Web设置界面,找到openvpn,点击启用,然后再点start就可以了。<br>如果有配置问题,可以输入命令查看日志<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /tmp/openvpn.log</span><br></pre></td></tr></table></figure></p><p>到此,服务端和客户端都已经搭建完成。如果有需要可以再测试一下连通。</p><h3 id="13-参考文章"><a href="#13-参考文章" class="headerlink" title="#13 参考文章"></a>#13 参考文章</h3><p>ECS服务器OPENVPN搭建,方便管理所有内网服务器<br>阿里云CentOS服务器上搭建openvpn<br>通过OpenWrt路由器和OpenVPN实现两地局域网互联</p>]]></content>
<summary type="html">
<blockquote>
<p>目标: 搭建完成之后,可以在服务器(外网)上直接输入校园网(内网)地址进行访问。<br><img src="/images/2017-04-22/OpenVPN.png" alt=""></p>
</blockquote>
<h3 id="00-前
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="日常配置" scheme="http://yoursite.com/tags/%E6%97%A5%E5%B8%B8%E9%85%8D%E7%BD%AE/"/>
<category term="OpenWrt" scheme="http://yoursite.com/tags/OpenWrt/"/>
</entry>
<entry>
<title>wxWidgets学习 - wxStaticText类</title>
<link href="http://yoursite.com/2016/12/14/2016-12-14-wxWidgets%E5%AD%A6%E4%B9%A0-wxStaticText%E7%B1%BB/"/>
<id>http://yoursite.com/2016/12/14/2016-12-14-wxWidgets学习-wxStaticText类/</id>
<published>2016-12-14T15:59:00.000Z</published>
<updated>2018-04-29T13:05:31.000Z</updated>
<content type="html"><![CDATA[<h2 id="wxStaticText类"><a href="#wxStaticText类" class="headerlink" title="wxStaticText类"></a>wxStaticText类</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><wx/stattext.h></span></span></span><br></pre></td></tr></table></figure><p>静态文本控件,显示一行或者多行只读文本。<br>wxStaticText控件支持三种典型的文本对齐。</p><h3 id="样式-Styles"><a href="#样式-Styles" class="headerlink" title="样式(Styles)"></a>样式(Styles)</h3><p>这个类支持以下样式:</p><ul><li><strong>wxALIGN_LEFT</strong>: 文本向左对齐。</li><li><strong>wxALIGN_RIGHT</strong>: 文本向右对齐。</li><li><strong>wxALIGN_CENTRE_HORIZONTAL</strong>: 文本水平居中。</li><li><strong>wxST_NO_AUTORESIZE</strong>: 默认情况下,当调用SetLabel()时,控件将调整到适合放下文本的大小。如果给出这个样式标志,控件就不会改变它的大小(这个样式对于具有wxALIGN_RIGHT或wxALIGN_CENTRE_HORIZONTAL样式的控件特别有用,因为否则在调用SetLabel()之后它们将不再有意义了。</li><li><strong>wxST_ELLIPSIZE_START</strong>: 如果标签文本宽度超过控件宽度,则用省略号替换标签的开头部分;此参数调用wxControl::Ellipsize。</li><li><strong>wxST_ELLIPSIZE_MIDDLE</strong>: 如果标签文本宽度超过控件宽度,则用省略号替换标签的中间部分;此参数调用wxControl::Ellipsize。</li><li><strong>wxST_ELLIPSIZE_END</strong>: 如果标签文本宽度超过控件宽度,则用省略号替换标签的末尾部分;此参数调用wxControl::Ellipsize。</li></ul><h3 id="公开成员函数(Public-Member-Functions"><a href="#公开成员函数(Public-Member-Functions" class="headerlink" title="公开成员函数(Public Member Functions)"></a>公开成员函数(Public Member Functions)</h3><p>wxStaticText()<br>默认构造函数</p><p>bool Create (wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxString &name=wxStaticTextNameStr)<br>构造函数,创建和显示文本控件。</p><p>bool Create (wxWindow *parent, wxWindowID id, const wxString &label, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxString &name=wxStaticTextNameStr)<br>生成功能,用于两步骤构建。</p><p>bool IsEllipsized () const<br>如果此控件的窗口样式包含wxST_ELLIPSIZE_START,wxST_ELLIPSIZE_MIDDLE或wxST_ELLIPSIZE_END样式之一,则返回true。</p><p>void Wrap (int width)<br>这个函数折叠控件标签内容,以使其每条线最多宽度为像素宽(如果可能的话,这些线在字边界处断开,因此如果单词太长,则可能不是这样)。</p><h3 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 两步创建模式</span></span><br><span class="line">wxStaticText* StaticText1 = <span class="keyword">new</span> wxStaticText();</span><br><span class="line">StaticText1->Create(<span class="keyword">this</span>, STATIC_TEXT_1, <span class="string">"这是一个测试"</span>, wxDefaultPosition, wxDefaultSize);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 单步步创建模式</span></span><br><span class="line">wxStaticText* StaticText2 = <span class="keyword">new</span> wxStaticText(<span class="keyword">this</span>, STATIC_TEXT_2, <span class="string">"test"</span>, wxDefaultPosition, wxDefaultSize);</span><br><span class="line"></span><br><span class="line">StaticText1->SetLabel(<span class="string">"Abc-test"</span>); <span class="comment">// 设置标签</span></span><br><span class="line">wxString str = StaticText1->GetLabelText(); <span class="comment">// 获取标签内容</span></span><br><span class="line">StaticText1->SetForegroundColour(*wxRED); <span class="comment">// 设置文本颜色</span></span><br><span class="line">StaticText1->SetBackgroundColour(*wxWHITE); <span class="comment">// 设置背景颜色</span></span><br><span class="line">wxSize tsize = StaticText1->GetSizeFromTextSize(<span class="number">100</span>, <span class="number">50</span>); <span class="comment">// 获取文本最佳大小</span></span><br><span class="line">StaticText2->SetLabelText(str);</span><br><span class="line">StaticText2->SetSize(tsize); <span class="comment">// 设置文本框大小</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="wxStaticText类"><a href="#wxStaticText类" class="headerlink" title="wxStaticText类"></a>wxStaticText类</h2><figure class="highlight cpp"
</summary>
<category term="框架学习" scheme="http://yoursite.com/categories/%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0/"/>
<category term="学习" scheme="http://yoursite.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="wxWidgets" scheme="http://yoursite.com/tags/wxWidgets/"/>
</entry>
<entry>
<title>Ubuntu 16.04 安装CodeBlocks</title>
<link href="http://yoursite.com/2016/10/14/2016-10-14-Ubuntu-16-04-%E5%AE%89%E8%A3%85CodeBlocks/"/>
<id>http://yoursite.com/2016/10/14/2016-10-14-Ubuntu-16-04-安装CodeBlocks/</id>
<published>2016-10-14T15:46:00.000Z</published>
<updated>2018-04-29T12:59:02.000Z</updated>
<content type="html"><![CDATA[<p>CodeBlocks在Ubuntu 14.04下会出现与原生的ibus有冲突,解决的办法很简单,装fcitx就行了。安装完之后记得装拼音输入法,这个很重要。</p><p>在Ubuntu 16.04下就比较简单了。</p><a id="more"></a><p>传统流程是这样的, 按快捷键<code>Ctrl + Alt + T</code>打开命令行终端:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install codeblocks</span><br></pre></td></tr></table></figure></p><p>然后直接在任务栏搜索框上搜索CodeBlocks就能打开使用。</p><p>上面安装的版本一般是13.12算是比较老的版本了,而现在最新的稳定版是16.01。</p><p>CodeBlocks 13.12也不是不能用,当然我也只是用了几分钟,就发现了在有激活项目的时候,也就是在写代码的时候,打开Setting的Editer会卡死。试了几次都是这样,无解。而且,还有一个致命的问题,不能自动缩进。当然这个不能缩进不是bug,只是我们没装全功能。</p><p>于是找了下,找到了解决问题的办法,在这个网址:<a href="https://launchpad.net/~damien-moore/+archive/ubuntu/codeblocks-stable" target="_blank" rel="noopener">https://launchpad.net/~damien-moore/+archive/ubuntu/codeblocks-stable</a> (这个网址可以在CodeBlocks官网的Dowload页面找到)</p><p>首先将软件源添加进来,就是运行以下命令<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo add-apt-repository ppa:damien-moore/codeblocks-stable</span><br><span class="line">sudo apt-get update</span><br></pre></td></tr></table></figure></p><p>完成之后,不管是不是已经安装了CodeBocks,使用命令<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install codeblocks</span><br></pre></td></tr></table></figure></p><p>都可以获取最新版本的CodeBlcoks。</p><p>获取完成了之后,这个CodeBlocks还是阉割版的。</p><p>还需运行以下 命令来把常用的插件装上<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install codeblocks-contrib</span><br></pre></td></tr></table></figure></p><p>然后,重启CodeBlocks就行了。</p><p>以下是我个人的喜好:</p><p>在CodeBlocks菜单Setting->Edit->General settings中可以取消设置Brace completion,这个选项是把括号自动补全取消,括号还是自己打才爽啊。</p><p>另外,使用一款好看的字体也是必须的,我个人喜欢Monaco,确实好看。</p><p>Moncao下载链接:<a href="https://github.com/todylu/monaco.ttf/blob/master/monaco.ttf?raw=true" target="_blank" rel="noopener">https://github.com/todylu/monaco.ttf/blob/master/monaco.ttf?raw=true</a></p><p>另外需要注意的是,直接下载双击就能安装。如果没有不能(我就遇到了,直接崩溃,什么字体都装不了),就升级一下,输入命令 sudo apt-get upgrade 升级下软件就能打开了。</p><p>参考博客:<br><a href="http://blog.csdn.net/boya734698063/article/details/38921429" target="_blank" rel="noopener">codeblocks缩进等设置</a><br><a href="http://blog.csdn.net/qq_26990831/article/details/51847416" target="_blank" rel="noopener">ubuntu16.04安装monaco字体</a></p>]]></content>
<summary type="html">
<p>CodeBlocks在Ubuntu 14.04下会出现与原生的ibus有冲突,解决的办法很简单,装fcitx就行了。安装完之后记得装拼音输入法,这个很重要。</p>
<p>在Ubuntu 16.04下就比较简单了。</p>
</summary>
<category term="Linux" scheme="http://yoursite.com/categories/Linux/"/>
<category term="日常配置" scheme="http://yoursite.com/tags/%E6%97%A5%E5%B8%B8%E9%85%8D%E7%BD%AE/"/>
<category term="Ubuntu" scheme="http://yoursite.com/tags/Ubuntu/"/>
</entry>
<entry>
<title>献给世界</title>
<link href="http://yoursite.com/2015/09/05/2015-09-05-%E7%8C%AE%E7%BB%99%E4%B8%96%E7%95%8C/"/>
<id>http://yoursite.com/2015/09/05/2015-09-05-献给世界/</id>
<published>2015-09-04T16:29:12.000Z</published>
<updated>2018-04-29T12:58:00.043Z</updated>
<content type="html"><![CDATA[<p>一入编程深似海,真系坑爹。</p><p>高考完了,爽吧。确实爽,有接近三个月的暑假。高中三年,无数次幻想这个暑假,充斥着自由、疯狂与青春。也做过无数计划。但最终,赶不上变化。</p><p>假期一有空就疯狂地写代码,写累了就睡觉,醒来又写,C++果然是学不完的语言。</p><a id="more"></a><p>很多人说,MFC已经是十几年前的玩意,已经不值得学。然而,我还是去了解了下。相比WIN32 API编程,便捷了不少,但是代码也很乱,而VC6这个落后于时代的IDE自身也有不少毛病,经常各种无理由错误。MFC确实是对API简单包装,很多函数就少了个句柄,因为MFC内部维护。Qt很优雅,也确实庞大。其实一开始是看上Qt的,也是由于生成的体积过大,转MFC,没想到也是巨坑。又要转回Qt了,当然MFC也没白学,至少简单了解了下。</p><p>李桃大师曾言:如果你不知道要去哪里,通常哪里都去不了。确实如此,在假期有段时间烦躁无比,明明知道自己很多不会,很多想学,却还是无从下手。我不知道目标在哪,不知道自己下一步想做什么。通常,这个时候是最苦恼的。因为什么都想学,贪多嚼不烂。学着别人,听了几首轻音乐,看看天空,放松心情,然后找出最喜欢的,学下去。然后烦恼就此解除。</p><p>我也不是代码狂人,天天看代码也确实会腻,每个星期都有不想写代码的7天。当把《汇编语言》看完时,整个人都疯了,汇编简直变态。汇编是非常底层的语言,用汇编写代码软件效率提上了,但写代码的效率不是那么理想。幸好是写小程序,不然彻底抓狂。在今天有C语言给我们用简直幸福,感谢D.M.Ritchie,感谢世界,Hello World!</p><p>假期复习了C Primer Plus,复习了C++ Primer Plus,也看了C陷阱和缺陷。(<em>(void(</em>)())0)();这句最为印象深刻,一眼看去高大上(咳咳,其实可用于装逼)。然后整个人就叼了起来,偶尔用来吓吓新手。</p><p>虽然假期学了不少,但始终时间不够用,有时晚上直接搞到凌晨。还有非常非常多的东西没学,有些至少连入门都没有做到。路途非常遥远,也将很艰辛,但无所畏惧。有句话说得很好,既然选择了远方,便只顾风雨兼程,既然目标是地平线,留给世界的只能是背影。</p><p>编程方面就这么多。</p><p>大学开学之际,写点东西。至逝去的三个月,至学生时代最长假期。</p><p>——2015.09.05 于家中</p><blockquote><p>博主简介: 本人擅长 Ai、Fw、Fl、Br、Ae、Pr、Id、Ps 等软件的安装与卸载,精通 CSS、JavaScript、PHP、ASP、C、C++、C#、Java、Ruby、Perl、Lisp、Python、Objective-C、ActionScript、Pascal 等单词的拼写,熟悉 Windows、Linux、OS X、Android、iOS、WP8 等系统的开关机。</p></blockquote>]]></content>
<summary type="html">
<p>一入编程深似海,真系坑爹。</p>
<p>高考完了,爽吧。确实爽,有接近三个月的暑假。高中三年,无数次幻想这个暑假,充斥着自由、疯狂与青春。也做过无数计划。但最终,赶不上变化。</p>
<p>假期一有空就疯狂地写代码,写累了就睡觉,醒来又写,C++果然是学不完的语言。</p>
</summary>
<category term="心情随笔" scheme="http://yoursite.com/categories/%E5%BF%83%E6%83%85%E9%9A%8F%E7%AC%94/"/>
<category term="随笔" scheme="http://yoursite.com/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title>HDU 1004 Let the Balloon Rise</title>
<link href="http://yoursite.com/2015/07/06/2015-07-06-HDU-1004-Let-the-Balloon-Rise/"/>
<id>http://yoursite.com/2015/07/06/2015-07-06-HDU-1004-Let-the-Balloon-Rise/</id>
<published>2015-07-06T12:50:19.000Z</published>
<updated>2018-04-29T12:50:19.000Z</updated>
<content type="html"><![CDATA[<h2 id="Let-the-Balloon-Rise"><a href="#Let-the-Balloon-Rise" class="headerlink" title="Let the Balloon Rise"></a>Let the Balloon Rise</h2><p>Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)<br>Total Submission(s): 87994 Accepted Submission(s): 33308</p><h3 id="Problem-Description"><a href="#Problem-Description" class="headerlink" title="Problem Description"></a>Problem Description</h3><p>Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges’ favorite time is guessing the most popular problem. When the contest is over, they will count the balloons of each color and find the result.</p><p>This year, they decide to leave this lovely job to you.</p><h3 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h3><p>Input contains multiple test cases. Each test case starts with a number N (0 < N <= 1000) – the total number of balloons distributed. The next N lines contain one color each. The color of a balloon is a string of up to 15 lower-case letters.</p><p>A test case with N = 0 terminates the input and this test case is not to be processed.</p><h3 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h3><p>For each case, print the color of balloon for the most popular problem on a single line. It is guaranteed that there is a unique solution for each test case.</p><h3 id="Sample-Input"><a href="#Sample-Input" class="headerlink" title="Sample Input"></a>Sample Input</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">5</span><br><span class="line">green</span><br><span class="line">red</span><br><span class="line">blue</span><br><span class="line">red</span><br><span class="line">red</span><br><span class="line">3</span><br><span class="line">pink</span><br><span class="line">orange</span><br><span class="line">pink</span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="Sample-Output"><a href="#Sample-Output" class="headerlink" title="Sample Output"></a>Sample Output</h3><p>···<br>red<br>pink<br>···</p><h3 id="Idea"><a href="#Idea" class="headerlink" title="Idea"></a>Idea</h3><p>给出各种颜色(字符串),求颜色相同最多的。<br>原题地址:<a href="http://acm.hdu.edu.cn/showproblem.php?pid=1004" target="_blank" rel="noopener">http://acm.hdu.edu.cn/showproblem.php?pid=1004</a></p><h3 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1005</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">int</span> i, j, max;</span><br><span class="line"> <span class="keyword">int</span> a[MAXN];</span><br><span class="line"> <span class="keyword">char</span> c[MAXN][<span class="number">16</span>];</span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> <span class="keyword">while</span>(n > <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">memset</span>(a, <span class="number">0</span>, <span class="keyword">sizeof</span>(<span class="keyword">int</span>) * MAXN);</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">0</span>; i < n; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%s"</span>, c[i]);</span><br><span class="line"> ++a[i];</span><br><span class="line"> <span class="keyword">for</span>(j = <span class="number">0</span>; j < i; j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">strcmp</span>(c[i], c[j]) == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> ++a[j]; <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> max = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">0</span>; i < n; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(a[max] < a[i]) max = i;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%s\n"</span>, c[max]);</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="Let-the-Balloon-Rise"><a href="#Let-the-Balloon-Rise" class="headerlink" title="Let the Balloon Rise"></a>Let the Balloon Rise</h2><
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="OJ" scheme="http://yoursite.com/tags/OJ/"/>
</entry>
<entry>
<title>HDU 1003 Max Sum</title>
<link href="http://yoursite.com/2015/07/05/2015-07-05-HDU-1003-Max-Sum/"/>
<id>http://yoursite.com/2015/07/05/2015-07-05-HDU-1003-Max-Sum/</id>
<published>2015-07-05T12:45:38.000Z</published>
<updated>2018-04-29T12:46:15.000Z</updated>
<content type="html"><![CDATA[<h2 id="Max-Sum"><a href="#Max-Sum" class="headerlink" title="Max Sum"></a>Max Sum</h2><p><em>Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)<br>Total Submission(s): 173855 Accepted Submission(s): 40493</em></p><h3 id="Problem-Description"><a href="#Problem-Description" class="headerlink" title="Problem Description"></a>Problem Description</h3><p>Given a sequence a[1],a[2],a[3]……a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.</p><h3 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h3><p>The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).</p><h3 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h3><p>For each test case, you should output two lines. The first line is “Case #:”, # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.</p><h3 id="Sample-Input"><a href="#Sample-Input" class="headerlink" title="Sample Input"></a>Sample Input</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">2</span><br><span class="line">5 6 -1 5 4 -7</span><br><span class="line">7 0 6 -1 1 -6 7 -5</span><br></pre></td></tr></table></figure><h3 id="Sample-Output"><a href="#Sample-Output" class="headerlink" title="Sample Output"></a>Sample Output</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Case 1:</span><br><span class="line">14 1 4</span><br><span class="line"></span><br><span class="line">Case 2:</span><br><span class="line">7 1 6</span><br></pre></td></tr></table></figure><h3 id="Idea"><a href="#Idea" class="headerlink" title="Idea"></a>Idea</h3><p>求最大子数组,要注意的是全是0和负数的情况(被坑了一下)<br>原题地址:<a href="http://acm.hdu.edu.cn/showproblem.php?pid=1003" target="_blank" rel="noopener">http://acm.hdu.edu.cn/showproblem.php?pid=1003</a></p><h3 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100005</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span>{</span> <span class="keyword">int</span> s, l, r; }Sum;</span><br><span class="line"><span class="function">Sum <span class="title">MaxSub</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> n)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> ar[MAXN], c, n, i, j;</span><br><span class="line"> Sum x = {<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);</span></span><br><span class="line"> <span class="comment">//freopen("output.txt", "w", stdout);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &c);</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= c; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> <span class="keyword">for</span>(j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &ar[j]);</span><br><span class="line"> x = MaxSub(ar, n);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Case %d:\n%d %d %d"</span>, i,x.s, x.l, x.r);</span><br><span class="line"> <span class="keyword">if</span>(i != c) <span class="built_in">printf</span>(<span class="string">"\n\n"</span>);</span><br><span class="line"> <span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">Sum <span class="title">MaxSub</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i, s = <span class="number">0</span>, l = <span class="number">1</span>, r = <span class="number">1</span>, b;</span><br><span class="line"> Sum sum = {a[<span class="number">1</span>], <span class="number">0</span>, <span class="number">0</span>};</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++) { <span class="keyword">if</span>(s >= <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> s += a[i];</span><br><span class="line"> <span class="keyword">if</span>(a[i] > <span class="number">0</span>) r = i;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> s = a[i];</span><br><span class="line"> r = l = i;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(s >= sum.s)</span><br><span class="line"> {</span><br><span class="line"> sum.s = s;</span><br><span class="line"> sum.l = l;</span><br><span class="line"> sum.r = r;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sum;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="Max-Sum"><a href="#Max-Sum" class="headerlink" title="Max Sum"></a>Max Sum</h2><p><em>Time Limit: 2000/1000 MS (Java/Others) Memory
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="OJ" scheme="http://yoursite.com/tags/OJ/"/>
</entry>
<entry>
<title>HDU 1002 A + B Problem II</title>
<link href="http://yoursite.com/2015/07/04/2015-07-04-HDU-1002-A-B-Problem-II/"/>
<id>http://yoursite.com/2015/07/04/2015-07-04-HDU-1002-A-B-Problem-II/</id>
<published>2015-07-04T12:39:18.000Z</published>
<updated>2018-04-29T12:19:35.000Z</updated>
<content type="html"><![CDATA[<h2 id="A-B-Problem-II"><a href="#A-B-Problem-II" class="headerlink" title="A + B Problem II"></a>A + B Problem II</h2><p><em>Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)<br>Total Submission(s): 257918 Accepted Submission(s): 49865</em></p><h3 id="Problem-Description"><a href="#Problem-Description" class="headerlink" title="Problem Description"></a>Problem Description</h3><p>I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.</p><h3 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h3><p>The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.</p><h3 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h3><p>For each test case, you should output two lines. The first line is “Case #:”, # means the number of the test case. The second line is the an equation “A + B = Sum”, Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.</p><h3 id="Sample-Input"><a href="#Sample-Input" class="headerlink" title="Sample Input"></a>Sample Input</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">2</span><br><span class="line">1 2</span><br><span class="line">112233445566778899 998877665544332211</span><br></pre></td></tr></table></figure><h3 id="Sample-Output"><a href="#Sample-Output" class="headerlink" title="Sample Output"></a>Sample Output</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Case 1:</span><br><span class="line">1 + 2 = 3</span><br><span class="line"></span><br><span class="line">Case 2:</span><br><span class="line">112233445566778899 + 998877665544332211 = 1111111111111111110</span><br></pre></td></tr></table></figure><h3 id="Idea"><a href="#Idea" class="headerlink" title="Idea"></a>Idea</h3><p>原题传送门:<a href="http://acm.hdu.edu.cn/showproblem.php?pid=1002" target="_blank" rel="noopener">http://acm.hdu.edu.cn/showproblem.php?pid=1002</a><br>新手必做题,简单的高精度加法,写了两个代码都AC了,第一个快些,第二个好理解些</p><h3 id="Code1"><a href="#Code1" class="headerlink" title="Code1"></a>Code1</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 1005</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> n, i = <span class="number">1</span>, n1, n2, k, j, p, q, x, m;</span><br><span class="line"> <span class="keyword">char</span> a[MAX], b[MAX], c[MAX];</span><br><span class="line"></span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);</span></span><br><span class="line"> <span class="comment">//freopen("output.txt","w", stdout);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> <span class="keyword">while</span>(n)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%s %s"</span>, a, b);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Case %d:\n%s + %s = "</span>, i, a, b);</span><br><span class="line"> n1 = <span class="built_in">strlen</span>(a) - <span class="number">1</span>;</span><br><span class="line"> n2 = <span class="built_in">strlen</span>(b) - <span class="number">1</span>;</span><br><span class="line"> k = x = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>( n1 >= <span class="number">0</span> || n2 >= <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> p = n1 >= <span class="number">0</span> ? a[n1--] - <span class="string">'0'</span> : <span class="number">0</span>;</span><br><span class="line"> q = n2 >= <span class="number">0</span> ? b[n2--] - <span class="string">'0'</span> : <span class="number">0</span>;</span><br><span class="line"> m = p + q + x;</span><br><span class="line"> x = m / <span class="number">10</span>;</span><br><span class="line"> m = m % <span class="number">10</span>;</span><br><span class="line"> c[k++] = m + <span class="string">'0'</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(j = k - <span class="number">1</span>; j >=<span class="number">0</span>; j--)</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%c"</span>, c[j]);</span><br><span class="line"> i++;</span><br><span class="line"> <span class="keyword">if</span>(n != <span class="number">1</span>) <span class="built_in">printf</span>(<span class="string">"\n\n"</span>);</span><br><span class="line"> <span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line"> n--;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="Code2"><a href="#Code2" class="headerlink" title="Code2"></a>Code2</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 1015</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Add</span><span class="params">(<span class="keyword">char</span> *a, <span class="keyword">char</span> *b, <span class="keyword">char</span> *c)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">int</span> i;</span><br><span class="line"> <span class="keyword">char</span> s1[MAX], s2[MAX], s3[MAX];</span><br><span class="line"></span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);</span></span><br><span class="line"> <span class="comment">//freopen("output.txt","w", stdout);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> <span class="comment">//while(getchar() != '\n') continue;</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++) { <span class="built_in">scanf</span>(<span class="string">"%s %s"</span>, s1, s2); Add(s1, s2, s3); <span class="built_in">printf</span>(<span class="string">"Case %d:\n%s + %s = %s"</span>, i, s1, s2, s3); <span class="keyword">if</span>(i == n) <span class="built_in">printf</span>(<span class="string">"\n"</span>); <span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"\n\n"</span>); } <span class="keyword">return</span> <span class="number">0</span>; } <span class="function"><span class="keyword">void</span> <span class="title">Add</span><span class="params">(<span class="keyword">char</span> *a, <span class="keyword">char</span> *b, <span class="keyword">char</span> *c)</span> </span>{ <span class="keyword">int</span> i = <span class="built_in">strlen</span>(a) - <span class="number">1</span>, j = <span class="built_in">strlen</span>(b) - <span class="number">1</span>, k = <span class="number">0</span>; <span class="keyword">int</span> x = <span class="number">0</span>, m = <span class="number">0</span>; <span class="keyword">char</span> t[MAX]; <span class="keyword">int</span> p, q; <span class="keyword">while</span>( i >= <span class="number">0</span> || j >= <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> p = i >= <span class="number">0</span> ? a[i--] - <span class="string">'0'</span> : <span class="number">0</span>;</span><br><span class="line"> q = j >= <span class="number">0</span> ? b[j--] - <span class="string">'0'</span> : <span class="number">0</span>;</span><br><span class="line"> m = p + q + x;</span><br><span class="line"> x = m / <span class="number">10</span>;</span><br><span class="line"> m = m % <span class="number">10</span>;</span><br><span class="line"> t[k++] = m + <span class="string">'0'</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">0</span>; i < k; i++)</span><br><span class="line"> c[i] = t[k - i - <span class="number">1</span>];</span><br><span class="line"> c[k] = <span class="string">'\0'</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="A-B-Problem-II"><a href="#A-B-Problem-II" class="headerlink" title="A + B Problem II"></a>A + B Problem II</h2><p><em>Time Limit: 20
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="OJ" scheme="http://yoursite.com/tags/OJ/"/>
</entry>
<entry>
<title>归并排序(Merge Sort)</title>
<link href="http://yoursite.com/2015/06/24/2015-06-24-%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F-Merge-Sort/"/>
<id>http://yoursite.com/2015/06/24/2015-06-24-归并排序-Merge-Sort/</id>
<published>2015-06-24T12:33:32.000Z</published>
<updated>2018-04-29T12:46:08.000Z</updated>
<content type="html"><![CDATA[<blockquote><p><strong>归并排序</strong>是稳定排序的一种,之所以说它稳定是因为,两个相等的数排序之后不会调换位置。(<em>当然这个是比较业余的说法,如果想得到准确答案,问度娘。</em>)归并排序的时间复杂度为<strong>O(nlgn)</strong>,同时归并排序做较少改动就可以求逆序对,只需改动最后一个for循环就可以。</p></blockquote><h3 id="算法原理"><a href="#算法原理" class="headerlink" title="算法原理"></a>算法原理</h3><p>1.二路归并排序是将两个已经有序的数组重新组合到一个有序的数组。<br>递归部分:<br>2.因为一个随机的数组分成两个数组(假设A和B)之后一般(A和B)不会是有序的,所以递归求解。<br>3.直到最后一个元素(一个元素是不用排序的),一个元素看成一个数组是有序的,所以递归返回。<br>非递归部分:<br>4.申请两个临时数组,用来存放分开的两组数据。<br>5.两个临时数组比较,哪边小就从哪边抽出元素放回原数组。(这里指的是升序排序)<br>6.直到没有。(为了少写代码,设置两个无穷大的数在数组的最后,效果自己模拟下看看)</p><a id="more"></a><h3 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><limits.h> /*INT_MAX支持*/</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX INT_MAX</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MergeSort</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> r)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Merge</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> q, <span class="keyword">int</span> r)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i, n;</span><br><span class="line"> <span class="keyword">int</span> ar[MAXN];</span><br><span class="line"> freopen(<span class="string">"input.txt"</span>, <span class="string">"r"</span>, <span class="built_in">stdin</span>); <span class="comment">/*重定向文件到标准输入输出*/</span></span><br><span class="line"> freopen(<span class="string">"output.txt"</span>, <span class="string">"w"</span>, <span class="built_in">stdout</span>);</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n); <span class="comment">/*读取数据个数*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++) <span class="comment">/*读取数据*/</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &ar[i]);</span><br><span class="line"> }</span><br><span class="line"> MergeSort(ar, <span class="number">1</span>, n); <span class="comment">/*调用归并排序*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++) <span class="comment">/*输出数据*/</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, ar[i]);</span><br><span class="line"> <span class="keyword">if</span>(i % <span class="number">10</span> == <span class="number">0</span>) <span class="comment">/*每行10个*/</span></span><br><span class="line"> <span class="built_in">putchar</span>(<span class="string">'\n'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MergeSort</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> q;</span><br><span class="line"> <span class="keyword">if</span>(p < r)</span><br><span class="line"> {</span><br><span class="line"> q = (p + r) / <span class="number">2</span>; <span class="comment">/*分治策略*/</span></span><br><span class="line"> MergeSort(a, p, q); <span class="comment">/*递归 不断将数组分成两部分,直到没法分*/</span></span><br><span class="line"> MergeSort(a, q + <span class="number">1</span>, r);</span><br><span class="line"> Merge(a, p, q, r);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Merge</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> q, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i, j, k;</span><br><span class="line"> <span class="keyword">int</span> m[q - p + <span class="number">2</span>]; <span class="comment">/*变长数组(VLA)*/</span></span><br><span class="line"> <span class="keyword">int</span> n[r - q + <span class="number">1</span>]; <span class="comment">/*C99特性:GCC编译需加-std=c99*/</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">0</span>; i < q - p + <span class="number">1</span>; i++) <span class="comment">/*将前a[p...q]复制到临时数组*/</span></span><br><span class="line"> m[i] = a[p + i];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(j = <span class="number">0</span>; j < r - q; j++) <span class="comment">/*将前a[q+1...r]复制到临时数组*/</span></span><br><span class="line"> n[j] = a[q + <span class="number">1</span> + j];</span><br><span class="line"></span><br><span class="line"> m[i] = n[j] = MAX; <span class="comment">/*定义为无穷大的数*/</span></span><br><span class="line"> i = j = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>( k = p; k <= r; k++) <span class="comment">/*两组已经有序的数据开始排序,合成一组*/</span> { <span class="keyword">if</span>(m[i] > n[j])</span><br><span class="line"> a[k] = n[j++];</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> a[k] = m[i++];</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="测试数据"><a href="#测试数据" class="headerlink" title="测试数据"></a>测试数据</h3><h4 id="输入"><a href="#输入" class="headerlink" title="输入"></a>输入</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">50</span><br><span class="line">77 30 48 66 25 86 84 56 27 10 </span><br><span class="line">58 64 4 47 2 41 27 88 90 97 </span><br><span class="line">73 71 81 91 16 26 37 87 93 21 </span><br><span class="line">88 41 58 26 7 12 62 96 78 16 </span><br><span class="line">83 41 18 6 6 60 16 87 9 74</span><br></pre></td></tr></table></figure><h4 id="输出"><a href="#输出" class="headerlink" title="输出"></a>输出</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">2 4 6 6 7 9 10 12 16 16 </span><br><span class="line">16 18 21 25 26 26 27 27 30 37 </span><br><span class="line">41 41 41 47 48 56 58 58 60 62 </span><br><span class="line">64 66 71 73 74 77 78 81 83 84 </span><br><span class="line">86 87 87 88 88 90 91 93 96 97</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<blockquote>
<p><strong>归并排序</strong>是稳定排序的一种,之所以说它稳定是因为,两个相等的数排序之后不会调换位置。(<em>当然这个是比较业余的说法,如果想得到准确答案,问度娘。</em>)归并排序的时间复杂度为<strong>O(nlgn)</strong>,同时归并排序做较少改动就可以求逆序对,只需改动最后一个for循环就可以。</p>
</blockquote>
<h3 id="算法原理"><a href="#算法原理" class="headerlink" title="算法原理"></a>算法原理</h3><p>1.二路归并排序是将两个已经有序的数组重新组合到一个有序的数组。<br>递归部分:<br>2.因为一个随机的数组分成两个数组(假设A和B)之后一般(A和B)不会是有序的,所以递归求解。<br>3.直到最后一个元素(一个元素是不用排序的),一个元素看成一个数组是有序的,所以递归返回。<br>非递归部分:<br>4.申请两个临时数组,用来存放分开的两组数据。<br>5.两个临时数组比较,哪边小就从哪边抽出元素放回原数组。(这里指的是升序排序)<br>6.直到没有。(为了少写代码,设置两个无穷大的数在数组的最后,效果自己模拟下看看)</p>
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>POJ 1804 Brainman</title>
<link href="http://yoursite.com/2015/06/23/2015-06-23-POJ-1804-Brainman/"/>
<id>http://yoursite.com/2015/06/23/2015-06-23-POJ-1804-Brainman/</id>
<published>2015-06-23T12:11:42.000Z</published>
<updated>2018-04-29T13:32:22.381Z</updated>
<content type="html"><![CDATA[<h1 id="Brainman"><a href="#Brainman" class="headerlink" title="Brainman"></a>Brainman</h1><p><em>Time Limit: 1000MS Memory Limit: 30000K<br>Total Submissions: 8755 Accepted: 4723</em></p><h3 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h3><h4 id="Background"><a href="#Background" class="headerlink" title="Background"></a>Background</h4><p>Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just by glancing at them. And he can even count Poker cards. Charlie would love to be able to do cool things like that, too. He wants to beat his brother in a similar task.</p><h4 id="Problem"><a href="#Problem" class="headerlink" title="Problem"></a>Problem</h4><p>Here’s what Charlie thinks of. Imagine you get a sequence of N numbers. The goal is to move the numbers around so that at the end the sequence is ordered. The only operation allowed is to swap two adjacent numbers. Let us try an example:<br>Start with: 2 8 0 3<br>swap (2 8) 8 2 0 3<br>swap (2 0) 8 0 2 3<br>swap (2 3) 8 0 3 2<br>swap (8 0) 0 8 3 2<br>swap (8 3) 0 3 8 2<br>swap (8 2) 0 3 2 8<br>swap (3 2) 0 2 3 8<br>swap (3 8) 0 2 8 3<br>swap (8 3) 0 2 3 8</p><p>So the sequence (2 8 0 3) can be sorted with nine swaps of adjacent numbers. However, it is even possible to sort it with three such swaps:<br>Start with: 2 8 0 3<br>swap (8 0) 2 0 8 3<br>swap (2 0) 0 2 8 3<br>swap (8 3) 0 2 3 8</p><p>The question is: What is the minimum number of swaps of adjacent numbers to sort a given sequence?Since Charlie does not have Raymond’s mental capabilities, he decides to cheat. Here is where you come into play. He asks you to write a computer program for him that answers the question. Rest assured he will pay a very good prize for it.</p><h3 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h3><p>The first line contains the number of scenarios.<br>For every scenario, you are given a line containing first the length N (1 <= N <= 1000) of the sequence,followed by the N elements of the sequence (each element is an integer in [-1000000, 1000000]). All numbers in this line are separated by single blanks.</p><h3 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h3><p>Start the output for every scenario with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print a single line containing the minimal number of swaps of adjacent numbers that are necessary to sort the given sequence. Terminate the output for the scenario with a blank line.</p><h3 id="Sample-Input"><a href="#Sample-Input" class="headerlink" title="Sample Input"></a>Sample Input</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">4</span><br><span class="line">4 2 8 0 3</span><br><span class="line">10 0 1 2 3 4 5 6 7 8 9</span><br><span class="line">6 -42 23 6 28 -100 65537</span><br><span class="line">5 0 0 0 0 0</span><br></pre></td></tr></table></figure><h3 id="Sample-Output"><a href="#Sample-Output" class="headerlink" title="Sample Output"></a>Sample Output</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Scenario #1:</span><br><span class="line">3</span><br><span class="line"></span><br><span class="line">Scenario #2:</span><br><span class="line">0</span><br><span class="line"></span><br><span class="line">Scenario #3:</span><br><span class="line">5</span><br><span class="line"></span><br><span class="line">Scenario #4:</span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="Idea"><a href="#Idea" class="headerlink" title="Idea"></a>Idea</h3><p>这题求逆序对,可以用改动归并排序来解决。POJ上的题目,原题地址:<a href="http://poj.org/problem?id=1804" target="_blank" rel="noopener">http://poj.org/problem?id=1804</a></p><h3 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1005</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 1000005</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MergeInversion</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> r)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Merge</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> q, <span class="keyword">int</span> r)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> ans;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i , j, n, x;</span><br><span class="line"> <span class="keyword">int</span> ar[MAXN];</span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &x);</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= x; i++)</span><br><span class="line"> {</span><br><span class="line"> ans = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"> <span class="keyword">for</span>(j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &ar[j]);</span><br><span class="line"> MergeInversion(ar, <span class="number">1</span>, n);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Scenario #%d:\n%d\n\n"</span>, i, ans);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MergeInversion</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> q;</span><br><span class="line"> <span class="keyword">if</span>(p < r)</span><br><span class="line"> {</span><br><span class="line"> q = (p + r) / <span class="number">2</span>;</span><br><span class="line"> MergeInversion(a, p, q);</span><br><span class="line"> MergeInversion(a, q + <span class="number">1</span>, r);</span><br><span class="line"> Merge(a, p, q, r);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Merge</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> p, <span class="keyword">int</span> q, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i, j, k;</span><br><span class="line"> <span class="keyword">int</span> m[q - p + <span class="number">2</span>], n[r - q + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">0</span>; i < q - p + <span class="number">1</span>; i++)</span><br><span class="line"> m[i] = a[p + i];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(j = <span class="number">0</span>; j < r - q; j++)</span><br><span class="line"> n[j] = a[q + j + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"> m[i] = n[j] = MAX;</span><br><span class="line"> i = j = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>( k = p; k <= r; k++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(m[i] <= n[j])</span><br><span class="line"> a[k] = m[i++];</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> a[k] = n[j++];</span><br><span class="line"> ans += q - (p + i) + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="Brainman"><a href="#Brainman" class="headerlink" title="Brainman"></a>Brainman</h1><p><em>Time Limit: 1000MS Memory Limit: 30000K<br
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="OJ" scheme="http://yoursite.com/tags/OJ/"/>
</entry>
<entry>
<title>选择排序(Selection Sort)</title>
<link href="http://yoursite.com/2015/06/21/2015-06-21-%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F%EF%BC%88Selection-Sort%EF%BC%89/"/>
<id>http://yoursite.com/2015/06/21/2015-06-21-选择排序(Selection-Sort)/</id>
<published>2015-06-21T12:03:48.000Z</published>
<updated>2018-04-29T12:22:15.450Z</updated>
<content type="html"><![CDATA[<blockquote><p><strong>选择排序</strong>是经典排序的一种,最差的时间复杂度为<strong>O(n^2</strong>),它的主要原理是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。</p></blockquote><a id="more"></a><p>代码如下:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 100</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Select</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> n)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> ar[MAX], n;</span><br><span class="line"> <span class="keyword">int</span> i;</span><br><span class="line"> freopen(<span class="string">"input.txt"</span>, <span class="string">"r"</span>, <span class="built_in">stdin</span>); <span class="comment">/*重定向标准输入输出*/</span></span><br><span class="line"> freopen(<span class="string">"output.txt"</span>, <span class="string">"w"</span>, <span class="built_in">stdout</span>);</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n); <span class="comment">/*写入数据*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &ar[i]);</span><br><span class="line"> Select(ar, n); <span class="comment">/*排序*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++) <span class="comment">/*输出数据*/</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, ar[i]);</span><br><span class="line"> <span class="keyword">if</span>(i % <span class="number">10</span> == <span class="number">0</span>)</span><br><span class="line"> <span class="built_in">putchar</span>(<span class="string">'\n'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Select</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> n)</span> <span class="comment">/*待排序数组a[1...n]*/</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> min, i, j, t;</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> {</span><br><span class="line"> min = i; <span class="comment">/*从a[i...n]选出最小值*/</span></span><br><span class="line"> <span class="keyword">for</span>(j = i + <span class="number">1</span>; j <= n; j++) { <span class="keyword">if</span>(a[min] > a[j])</span><br><span class="line"> min = j;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(min != i) <span class="comment">/*交换*/</span></span><br><span class="line"> {</span><br><span class="line"> t = a[min]; a[min] = a[i]; a[i] = t;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>测试数据:<br>输入:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">50</span><br><span class="line">13 95 29 62 69 34 74 38 29 78 </span><br><span class="line">29 67 98 22 27 13 92 26 94 98 </span><br><span class="line">28 62 2 27 23 92 87 96 11 93 </span><br><span class="line">25 94 6 15 35 63 61 88 80 5 </span><br><span class="line">39 47 36 35 26 83 39 77 25 61</span><br></pre></td></tr></table></figure></p><p>输出:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">2 5 6 11 13 13 15 22 23 25 </span><br><span class="line">25 26 26 27 27 28 29 29 29 34 </span><br><span class="line">35 35 36 38 39 39 47 61 61 62 </span><br><span class="line">62 63 67 69 74 77 78 80 83 87 </span><br><span class="line">88 92 92 93 94 94 95 96 98 98</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<blockquote>
<p><strong>选择排序</strong>是经典排序的一种,最差的时间复杂度为<strong>O(n^2</strong>),它的主要原理是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。</p>
</blockquote>
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>插入排序的C语言实现</title>
<link href="http://yoursite.com/2015/06/20/2015-06-20-%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E7%9A%84C%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0/"/>
<id>http://yoursite.com/2015/06/20/2015-06-20-插入排序的C语言实现/</id>
<published>2015-06-20T07:08:08.000Z</published>
<updated>2018-04-29T07:18:08.000Z</updated>
<content type="html"><![CDATA[<p><strong>插入排序</strong>,稳定排序的一种,<strong>平均时间复杂度为O(n^2)</strong>,它的代码量很小,对于处理小数据的排序还是可以的。<br>排序扑克牌可以形象地描述插入排序(贴近生活),算法导论就是用它来引入主题的。</p><a id="more"></a><blockquote><p>算法描述如下(摘自百度百科):<br>⒈ 从第一个元素开始,该元素可以认为已经被排序<br>⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描<br>⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置<br>⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置<br>⒌ 将新元素插入到下一位置中<br>⒍ 重复步骤2~5</p></blockquote><p>具体代码如下:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 100</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Insert</span><span class="params">(<span class="keyword">int</span> [], <span class="keyword">int</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">int</span> ar[MAX];</span><br><span class="line"> <span class="comment">//freopen("input.txt", "r", stdin);/*可以将标准输入输出重定向到文件*/</span></span><br><span class="line"> <span class="comment">//freopen("output.txt","w", stdout);</span></span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n); <span class="comment">/*读取待排序元素的个数*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &ar[i]); <span class="comment">/*读取元素并写入数组中*/</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> Insert(ar, n); <span class="comment">/*排序*/</span></span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"%d "</span>, ar[i]); <span class="comment">/*显示排序后的数据*/</span></span><br><span class="line"> <span class="keyword">if</span>(i % <span class="number">10</span> == <span class="number">0</span>) <span class="built_in">putchar</span>(<span class="string">'\n'</span>); <span class="comment">/*输出每10个元素一行*/</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Insert</span><span class="params">(<span class="keyword">int</span> a[], <span class="keyword">int</span> n)</span> <span class="comment">//a数组有效数据是下标1...n</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> i, j;</span><br><span class="line"> <span class="keyword">for</span>(i = <span class="number">2</span>; i <= n; i++)</span><br><span class="line"> {</span><br><span class="line"> a[<span class="number">0</span>] = a[i]; <span class="comment">/*用a[0]作为临时保存a[i]的变量*/</span></span><br><span class="line"> j = i<span class="number">-1</span>;</span><br><span class="line"> <span class="keyword">while</span>(a[<span class="number">0</span>] < a[j]) <span class="comment">/*从a[i - 1]开始到a[0]逐个检查,并将元素推后*/</span> a[j + <span class="number">1</span>] = a[j--]; a[j + <span class="number">1</span>] = a[<span class="number">0</span>]; <span class="comment">/*找到合适位置,将元素插入*/</span> } } </span><br><span class="line"></span><br><span class="line"><span class="comment">/* void Insert(int a[], int n) //递归版本 { int i; if(n > 1)</span></span><br><span class="line"><span class="comment"> {</span></span><br><span class="line"><span class="comment"> Insert(a, n - 1);</span></span><br><span class="line"><span class="comment"> i = n - 1;</span></span><br><span class="line"><span class="comment"> a[0] = a[n];</span></span><br><span class="line"><span class="comment"> while(a[0] < a[i])</span></span><br><span class="line"><span class="comment"> a[i + 1] = a[i--];</span></span><br><span class="line"><span class="comment"> a[i + 1] = a[0];</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment">}</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure></p><p>测试数据:<br>输入:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">50</span><br><span class="line">5 17 18 97 72 71 62 84 66 38 </span><br><span class="line">25 68 86 57 45 5 70 51 52 97 </span><br><span class="line">35 4 55 24 62 63 33 64 84 75 </span><br><span class="line">26 32 69 51 67 26 53 87 18 33 </span><br><span class="line">33 94 2 84 76 93 19 76 53 81</span><br></pre></td></tr></table></figure></p><p>输出:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">2 4 5 5 17 18 18 19 24 25 </span><br><span class="line">26 26 32 33 33 33 35 38 45 51 </span><br><span class="line">51 52 53 53 55 57 62 62 63 64 </span><br><span class="line">66 67 68 69 70 71 72 75 76 76 </span><br><span class="line">81 84 84 84 86 87 93 94 97 97</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p><strong>插入排序</strong>,稳定排序的一种,<strong>平均时间复杂度为O(n^2)</strong>,它的代码量很小,对于处理小数据的排序还是可以的。<br>排序扑克牌可以形象地描述插入排序(贴近生活),算法导论就是用它来引入主题的。</p>
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>Kruskal算法的C语言实现(并查集版)</title>
<link href="http://yoursite.com/2014/02/23/2014-02-23-Kruskal%E7%AE%97%E6%B3%95%E7%9A%84C%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%EF%BC%88%E5%B9%B6%E6%9F%A5%E9%9B%86%E7%89%88%EF%BC%89/"/>
<id>http://yoursite.com/2014/02/23/2014-02-23-Kruskal算法的C语言实现(并查集版)/</id>
<published>2014-02-22T16:07:00.000Z</published>
<updated>2018-04-29T16:15:57.000Z</updated>
<content type="html"><![CDATA[<blockquote><p>Kruskal算法求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。</p></blockquote><a id="more"></a><p>首先,文章不是LZ写的,在网上看到比我写的更好的,直接拿过来了。<br>编写程序:对于如下一个带权无向图,给出所有边以及权值,用kruskal算法求最小生成树。<br>样例输入:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">11</span></span><br><span class="line">A B <span class="number">7</span></span><br><span class="line">A D <span class="number">5</span></span><br><span class="line">B C <span class="number">8</span></span><br><span class="line">B D <span class="number">9</span></span><br><span class="line">B E <span class="number">7</span></span><br><span class="line">C E <span class="number">5</span></span><br><span class="line">D E <span class="number">15</span></span><br><span class="line">D F <span class="number">6</span></span><br><span class="line">E F <span class="number">8</span></span><br><span class="line">E G <span class="number">9</span></span><br><span class="line">F G <span class="number">11</span></span><br></pre></td></tr></table></figure></p><p>样例输出:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">A - D : <span class="number">5</span></span><br><span class="line">C - E : <span class="number">5</span></span><br><span class="line">D - F : <span class="number">6</span></span><br><span class="line">A - B : <span class="number">7</span></span><br><span class="line">B - E : <span class="number">7</span></span><br><span class="line">E - G : <span class="number">9</span></span><br><span class="line">Total:<span class="number">39</span></span><br></pre></td></tr></table></figure></p><p>代码如下:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX 100</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 定义边(x,y),权为w */</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">int</span> w;</span><br><span class="line">}edge;</span><br><span class="line"> </span><br><span class="line">edge e[MAX];</span><br><span class="line"><span class="comment">/* rank[x]表示x的秩 */</span></span><br><span class="line"><span class="keyword">int</span> rank[MAX];</span><br><span class="line"><span class="comment">/* father[x]表示x的父节点 */</span></span><br><span class="line"><span class="keyword">int</span> father[MAX];</span><br><span class="line"><span class="keyword">int</span> sum;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 比较函数,按权值(相同则按x坐标)非降序排序 */</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">cmp</span><span class="params">(<span class="keyword">const</span> <span class="keyword">void</span> *a, <span class="keyword">const</span> <span class="keyword">void</span> *b)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> ((*(edge *)a).w == (*(edge *)b).w)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">return</span> (*(edge *)a).x - (*(edge *)b).x;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> (*(edge *)a).w - (*(edge *)b).w;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 初始化集合 */</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Make_Set</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">father[x] = x;</span><br><span class="line">rank[x] = <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 查找x元素所在的集合,回溯时压缩路径 */</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Find_Set</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> (x != father[x])</span><br><span class="line">{</span><br><span class="line">father[x] = Find_Set(father[x]);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> father[x];</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 合并x,y所在的集合 */</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Union</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> w)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> (x == y) <span class="keyword">return</span>;</span><br><span class="line"><span class="comment">/* 将秩较小的树连接到秩较大的树后 */</span></span><br><span class="line"><span class="keyword">if</span> (rank[x] > rank[y])</span><br><span class="line">{</span><br><span class="line">father[y] = x;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (rank[x] == rank[y])</span><br><span class="line">{</span><br><span class="line">rank[y]++;</span><br><span class="line">}</span><br><span class="line">father[x] = y;</span><br><span class="line">}</span><br><span class="line">sum += w;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 主函数 */</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, n;.</span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line"><span class="keyword">char</span> chx, chy;</span><br><span class="line"><span class="comment">//freopen("kruskal.in", "r",stdin);</span></span><br><span class="line"><span class="comment">//freopen("kruskal.out", "w", stdout);</span></span><br><span class="line"><span class="comment">/* 读取边的数目 */</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line">getchar();</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 读取边信息并初始化集合 */</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < n; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%c %c %d"</span>, &chx, &chy, &e[i].w);</span><br><span class="line">getchar();</span><br><span class="line">e[i].x = chx - <span class="string">'A'</span>;</span><br><span class="line">e[i].y = chy - <span class="string">'A'</span>;</span><br><span class="line">Make_Set(i);</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* 将边排序 */</span></span><br><span class="line">qsort(e, n, <span class="keyword">sizeof</span>(edge), cmp);</span><br><span class="line"> </span><br><span class="line">sum = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < n; i++)</span><br><span class="line">{</span><br><span class="line">x = Find_Set(e[i].x);</span><br><span class="line">y = Find_Set(e[i].y);</span><br><span class="line"><span class="keyword">if</span> (x != y)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%c - %c : %d\n"</span>, e[i].x + <span class="string">'A'</span>, e[i].y + <span class="string">'A'</span>, e[i].w);</span><br><span class="line">Union(x, y, e[i].w);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Total:%d\n"</span>, sum);</span><br><span class="line"><span class="comment">//system("pause");</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>文章作者:姜南(Slyar) 文章来源:Slyar Home</p>]]></content>
<summary type="html">
<blockquote>
<p>Kruskal算法求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。</p>
</blockquote>
</summary>
<category term="算法学习" scheme="http://yoursite.com/categories/%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="算法" scheme="http://yoursite.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>浅谈const关键字与指针、define、typedef混用</title>
<link href="http://yoursite.com/2014/02/08/2014-02-08-%E6%B5%85%E8%B0%88const%E5%85%B3%E9%94%AE%E5%AD%97%E4%B8%8E%E6%8C%87%E9%92%88%E3%80%81define%E3%80%81typedef%E6%B7%B7%E7%94%A8/"/>
<id>http://yoursite.com/2014/02/08/2014-02-08-浅谈const关键字与指针、define、typedef混用/</id>
<published>2014-02-08T07:19:00.000Z</published>
<updated>2018-04-29T16:09:46.000Z</updated>
<content type="html"><![CDATA[<p>下面有四条声明,const修饰的到底是哪个?是a是常量还是*a是常量?由于只是关键字调换下顺序,是非常容易搞混的。我来详细说下。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> * a = &b;</span><br><span class="line"><span class="keyword">int</span> <span class="keyword">const</span> * a = &b;</span><br><span class="line"><span class="keyword">int</span> * <span class="keyword">const</span> a = &b;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> * <span class="keyword">const</span> a = &b;</span><br></pre></td></tr></table></figure></p><p>区分它们是非常简单的,只需要下面记住两条规则:</p><p>如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;<br>如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。<br>于是乎,刚才的四条声明也就容易区分了。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> * a = &b; <span class="comment">//const在*的左边 ,用来修饰a所指向的地址的值,*a为常量</span></span><br><span class="line"><span class="keyword">int</span> <span class="keyword">const</span> * a = &b; <span class="comment">//这句与上句是相同的,const在*的左边</span></span><br><span class="line"><span class="keyword">int</span> * <span class="keyword">const</span> a = &b; <span class="comment">//const在*的右边 那么const修饰的是a本身, a是常量</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> * <span class="keyword">const</span> a = &b; <span class="comment">//a与*a均为常量,都不能被改变 </span></span><br><span class="line">如果还是不明白,请上机测试下,分别给a和*a赋值,常量一般情况是不能被改变的(当然有特殊情况,以后再说)。</span><br></pre></td></tr></table></figure></p><p>我这里再说下const与define、typedef,是否跟我们想象的那样。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span>* pint; </span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PINT int*</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> k = <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> pint m = &k;</span><br><span class="line"><span class="keyword">const</span> PINT n= &k;</span><br></pre></td></tr></table></figure></p><p>我们用一个完整的程序(其实有错误,等下就知道了)来测试。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span>* pint; </span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PINT int*</span></span><br><span class="line"><span class="keyword">int</span> k = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> pint m = &k; </span><br><span class="line"><span class="keyword">const</span> PINT n= &k; </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> b = <span class="number">2</span>;</span><br><span class="line"> *m = <span class="number">3</span>;</span><br><span class="line"> *n = <span class="number">3</span>;</span><br><span class="line"> m = &b;</span><br><span class="line"> n = &b;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>放上面的代码上去测试,我们看到编译出错了,位置是<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*n = <span class="number">3</span>;</span><br></pre></td></tr></table></figure></p><p>很明显*n是不可改变的,我们自己也可以很容易推是我出来。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PINT int*</span></span><br><span class="line"><span class="keyword">int</span> k = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> PINT n= &k; <span class="comment">//等价于const int * n = &k; </span></span><br><span class="line"><span class="comment">//const PINT n= &k; 被预处理为const int * n = &k;</span></span><br></pre></td></tr></table></figure></p><p>我们接着这把*n = 3;注释掉,再编译一次,发现又出错了,错误的地方是<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">m = &b;</span><br></pre></td></tr></table></figure></p><p>也就是说明指针m是常量,这倒是出乎意料了,<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span>* pint;</span><br><span class="line"><span class="keyword">int</span> k = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> pint m = &k; </span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span>* m = &k; <span class="comment">//这两句竟然不是相等的!为什么呢?</span></span><br></pre></td></tr></table></figure></p><p>其实这里很多人把typedef当成了define。<br>typedef不是define,typedef是别名。<br>我们仔细看下pint, pint是指针类型,const的指针当然是int *const<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span>* pint;</span><br><span class="line"><span class="keyword">int</span> k = <span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> pint m = &k; <span class="comment">//相当于int* const m = &k; </span></span><br><span class="line"><span class="comment">//typedef不是宏代换,ping是个指针类型,const的指针是int *const</span></span><br></pre></td></tr></table></figure></p><p>好了,其实const关键字与指针、define、typedef混用也不是太麻烦嘛。</p>]]></content>
<summary type="html">
<p>下面有四条声明,const修饰的到底是哪个?是a是常量还是*a是常量?由于只是关键字调换下顺序,是非常容易搞混的。我来详细说下。<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span
</summary>
<category term="学习" scheme="http://yoursite.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="C语言" scheme="http://yoursite.com/tags/C%E8%AF%AD%E8%A8%80/"/>
</entry>
</feed>