-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathatom.xml
More file actions
585 lines (315 loc) · 270 KB
/
Copy pathatom.xml
File metadata and controls
585 lines (315 loc) · 270 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
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>DjangoZ's blog</title>
<subtitle>Just for fun</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://www.djangoz.com/"/>
<updated>2020-04-22T08:33:19.100Z</updated>
<id>https://www.djangoz.com/</id>
<author>
<name>DjangoZ</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>RocketMQ通过docker快速搭建及调试</title>
<link href="https://www.djangoz.com/2020/04/03/docker-install-rocketmq/"/>
<id>https://www.djangoz.com/2020/04/03/docker-install-rocketmq/</id>
<published>2020-04-03T07:30:34.000Z</published>
<updated>2020-04-22T08:33:19.100Z</updated>
<content type="html"><![CDATA[<p>最近本人在搞毕设,准备做一个oj,其中判题沙盒模块准备用消息队列来实现判题的并行化。下面是用docker来搭建和调试RocketMQ的过程</p><h2 id="安装-Namesrv"><a href="#安装-Namesrv" class="headerlink" title="安装 Namesrv"></a>安装 Namesrv</h2><h3 id="拉取官方镜像"><a href="#拉取官方镜像" class="headerlink" title="拉取官方镜像"></a>拉取官方镜像</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull rocketmqinc/rocketmq:4.4.0</span><br></pre></td></tr></table></figure><h3 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -d -p 9876:9876 -v {RmHome}/data/namesrv/logs:/root/logs -v {RmHome}/data/namesrv/store:/root/store --name rmqnamesrv -e "MAX_POSSIBLE_HEAP=100000000" rocketmqinc/rocketmq:4.4.0 sh mqnamesrv</span><br></pre></td></tr></table></figure><h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h3><p>{RmHome} 要替换成你的宿主机想保存 MQ 的日志与数据的地方,通过 docker 的 -v 参数使用 volume 功能,把你本地的目录映射到容器内的目录上。否则所有数据都默认保存在容器运行时的内存中,重启之后就又回到最初的起点。</p><h2 id="安装-broker-服务器"><a href="#安装-broker-服务器" class="headerlink" title="安装 broker 服务器"></a>安装 broker 服务器</h2><p>与上一个是同一个docker镜像,无需拉取</p><h3 id="创建broker-conf文件"><a href="#创建broker-conf文件" class="headerlink" title="创建broker.conf文件"></a>创建broker.conf文件</h3><ol><li>在 {RmHome}/conf 目录下创建 broker.conf 文件</li><li>在 broker.conf 中写入如下内容<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></pre></td><td class="code"><pre><span class="line">brokerClusterName = DefaultCluster</span><br><span class="line">brokerName = broker-a</span><br><span class="line">brokerId = 0</span><br><span class="line">deleteWhen = 04</span><br><span class="line">fileReservedTime = 48</span><br><span class="line">brokerRole = ASYNC_MASTER</span><br><span class="line">flushDiskType = ASYNC_FLUSH</span><br><span class="line">brokerIP1 = {本机局域网 IP}</span><br></pre></td></tr></table></figure></li></ol><h3 id="启动容器-1"><a href="#启动容器-1" class="headerlink" title="启动容器"></a>启动容器</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -d -p 10911:10911 -p 10909:10909 -v {RmHome}/data/broker/logs:/root/logs -v {RmHome}/rocketmq/data/broker/store:/root/store -v {RmHome}/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq:4.4.0 sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf</span><br></pre></td></tr></table></figure><p>其中 brokerIP1 需要自己修改,不能是127.0.0.1 因为运行在docker容器里面的,localhost与宿主机器隔离,需要使用连接的局域网ip,否则会有各种异常产生</p><h2 id="安装rocketmq控制台"><a href="#安装rocketmq控制台" class="headerlink" title="安装rocketmq控制台"></a>安装rocketmq控制台</h2><h3 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr={本机局域网 IP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t pangliang/rocketmq-console-ng</span><br></pre></td></tr></table></figure><p>Drocketmq.namesrv.addr的ip就是上一步配置文件设置的brokerIP1</p><p>此时运行若无异常,console日志打出如下,则运行成功<br><figure class="highlight shell"><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">[2020-04-03 06:23:30.049] INFO closeChannel: close the connection to remote address[192.168.31.156:10911] result: true</span><br><span class="line">[2020-04-03 06:23:59.976] INFO closeChannel: close the connection to remote address[192.168.31.156:10911] result: true</span><br><span class="line">[2020-04-03 06:24:00.045] INFO closeChannel: close the connection to remote address[192.168.31.156:9876] result: true</span><br><span class="line">[2020-04-03 06:24:30.031] INFO closeChannel: close the connection to remote address[192.168.31.156:9876] result: true</span><br><span class="line">[2020-04-03 06:24:30.035] INFO closeChannel: close the connection to remote address[192.168.31.156:10911] result: true</span><br><span class="line">[2020-04-03 06:24:59.961] INFO closeChannel: close the connection to remote address[192.168.31.156:9876] result: true</span><br><span class="line">[2020-04-03 06:25:00.027] INFO closeChannel: close the connection to remote address[192.168.31.156:10911] result: true</span><br></pre></td></tr></table></figure></p><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/rocketmq1.png" alt="" title=""> </div> <div class="image-caption"></div> </figure><p>涉及到的容器如下</p><figure class="highlight shell"><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">▶ docker container ls</span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">fea34a9874b0 pangliang/rocketmq-console-ng "sh -c 'java $JAVA_O…" 13 minutes ago Up 13 minutes 0.0.0.0:8080->8080/tcp ecstatic_ritchie</span><br><span class="line">50d543af5485 rocketmqinc/rocketmq:4.4.0 "sh mqbroker -c /opt…" 17 hours ago Up 6 seconds 0.0.0.0:10909->10909/tcp, 9876/tcp, 0.0.0.0:10911->10911/tcp rmqbroker</span><br><span class="line">f4c9e15adb96 rocketmqinc/rocketmq:4.4.0 "sh mqnamesrv" 17 hours ago Up 17 hours 10909/tcp, 0.0.0.0:9876->9876/tcp, 10911/tcp rmqnamesrv</span><br></pre></td></tr></table></figure><h2 id="安装c语言依赖库"><a href="#安装c语言依赖库" class="headerlink" title="安装c语言依赖库"></a>安装c语言依赖库</h2><p>第一次跑go程序之前,还要先安装相关依赖包,不然可能会出现</p><figure class="highlight shell"><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">rocketmq-client-go/core/cfuns.go:21:10: fatal error: 'rocketmq/CMessageExt.h' file not found</span><br><span class="line"><span class="meta">#</span>include "rocketmq/CMessageExt.h"</span><br><span class="line">^~~~~~~~~~~~~~~~~~~~~~~~</span><br><span class="line">1 error generated.</span><br></pre></td></tr></table></figure><p>下面是解决步骤</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">1. git clone https://github.com/apache/rocketmq-client-cpp</span><br><span class="line"></span><br><span class="line">2. mkdir -p /usr/local/include/rocketmq/</span><br><span class="line"></span><br><span class="line">3. cp rocketmq-client-cpp/include/* /usr/local/include/rocketmq</span><br><span class="line"></span><br><span class="line">4. sh build.sh</span><br><span class="line"></span><br><span class="line">5. after build sucess, cp bin/librocketmq.dylib /usr/local/lib</span><br><span class="line"></span><br><span class="line">6. install the go SDK.</span><br><span class="line"></span><br><span class="line">7. go build your code.</span><br></pre></td></tr></table></figure><h2 id="go语言实现producer"><a href="#go语言实现producer" class="headerlink" title="go语言实现producer"></a>go语言实现producer</h2><p>参考(官方demo)[<a href="https://github.com/apache/rocketmq-client-go/blob/master/examples/producer.go]" target="_blank" rel="noopener">https://github.com/apache/rocketmq-client-go/blob/master/examples/producer.go]</a></p><ol><li>先在控制台新建一个topic<figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/rocketmq2.png" alt="" title=""> </div> <div class="image-caption"></div> </figure></li><li>代码中修改 NameServer 和 Topic即可</li></ol><p>参考代码<br><figure class="highlight golang"><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><br><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"fmt"</span></span><br><span class="line"><span class="string">"github.com/apache/rocketmq-client-go/core"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Main0</span><span class="params">()</span></span> {</span><br><span class="line">pConfig := &rocketmq.ProducerConfig{</span><br><span class="line">ClientConfig: rocketmq.ClientConfig{</span><br><span class="line">GroupID: <span class="string">"broker-a"</span>,</span><br><span class="line">NameServer: <span class="string">"http://192.168.31.156:9876"</span>,</span><br><span class="line">},</span><br><span class="line">ProducerModel: rocketmq.CommonProducer,</span><br><span class="line">}</span><br><span class="line">sendMessage(pConfig)</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sendMessage</span><span class="params">(config *rocketmq.ProducerConfig)</span></span> {</span><br><span class="line">producer, err := rocketmq.NewProducer(config)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> {</span><br><span class="line">fmt.Println(<span class="string">"create common producer failed, error:"</span>, err)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">err = producer.Start()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> {</span><br><span class="line">fmt.Println(<span class="string">"start common producer error"</span>, err)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">defer</span> producer.Shutdown()</span><br><span class="line"></span><br><span class="line">fmt.Printf(<span class="string">"Common producer: %s started... \n"</span>, producer)</span><br><span class="line"><span class="keyword">for</span> i := <span class="number">0</span>; i < <span class="number">10</span>; i++ {</span><br><span class="line">msg := fmt.Sprintf(<span class="string">"%s-%d"</span>, <span class="string">"Hello,Common MQ Message-"</span>, i)</span><br><span class="line">result, err := producer.SendMessageSync(&rocketmq.Message{Topic: <span class="string">"test_1"</span>, Body: msg})</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> {</span><br><span class="line">fmt.Println(<span class="string">"Error:"</span>, err)</span><br><span class="line">}</span><br><span class="line">fmt.Printf(<span class="string">"send message: %s result: %s\n"</span>, msg, result)</span><br><span class="line">}</span><br><span class="line">fmt.Println(<span class="string">"shutdown common producer."</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">Main0()</span><br><span class="line">}</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></pre></td><td class="code"><pre><span class="line">Common producer: ProducerConfig=[GroupId: broker-a, NameServer: http://192.168.31.156:9876, ProducerModel: CommonProducer, ] started... </span><br><span class="line">send message: Hello,Common MQ Message--0 result: [status: SendOK, messageId: C0A81F9C77926C5F71990DBE59BD0000, offset: 1]</span><br><span class="line">send message: Hello,Common MQ Message--1 result: [status: SendOK, messageId: C0A81F9C77926C5F71990DBE59F60001, offset: 1]</span><br><span class="line">send message: Hello,Common MQ Message--2 result: [status: SendOK, messageId: C0A81F9C77926C5F71990DBE5A000002, offset: 2]</span><br></pre></td></tr></table></figure></p><h2 id="go语言实现consumer"><a href="#go语言实现consumer" class="headerlink" title="go语言实现consumer"></a>go语言实现consumer</h2><p>参考<a href="https://github.com/apache/rocketmq-client-go/blob/master/examples/push_consumer.go" target="_blank" rel="noopener">官方demo</a></p><p>修改对应topic和NameServer即可运行</p><p>运行消费者代码,完成消息消费<br><figure class="highlight shell"><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">INFO[0000] subscribe topic[test_1] with expression[*] successfully. </span><br><span class="line">consumer: [PushConsumerConfig=[GroupId: broker-a, NameServer: http://192.168.31.156:9876, MessageModel: Clustering, ConsumerModel: Orderly, ], subcribed topics: [test_1, ]] started...</span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE59BD0000, Body:Hello,Common MQ Message--0 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A000002, Body:Hello,Common MQ Message--2 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE59F60001, Body:Hello,Common MQ Message--1 </span><br><span class="line">Consumer Later, MessageID:C0A81F9C77926C5F71990DBE59F60001 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A150003, Body:Hello,Common MQ Message--3 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A400004, Body:Hello,Common MQ Message--4 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A710007, Body:Hello,Common MQ Message--7 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A640006, Body:Hello,Common MQ Message--6 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A510005, Body:Hello,Common MQ Message--5 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A800008, Body:Hello,Common MQ Message--8 </span><br><span class="line">Consumer Later, MessageID:C0A81F9C77926C5F71990DBE5A800008 </span><br><span class="line">A message received, MessageID:C0A81F9C77926C5F71990DBE5A8D0009, Body:Hello,Common MQ Message--9</span><br></pre></td></tr></table></figure></p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p><a href="https://juejin.im/post/5d823ddcf265da03c428c707" target="_blank" rel="noopener">【Rocketmq】通过 docker 快速搭建 rocketmq 环境</a><br><a href="http://www.justdojava.com/2019/08/26/rocketmq-creator/" target="_blank" rel="noopener">rocketmq 部署启动指南-Docker 版</a><br><a href="https://github.com/apache/rocketmq-client-go" target="_blank" rel="noopener">apache/rocketmq-client-go</a><br><a href="https://github.com/apache/rocketmq-client-go/issues/3" target="_blank" rel="noopener">go get rocketmq-client-go error #3</a></p>]]></content>
<summary type="html">
<p>最近本人在搞毕设,准备做一个oj,其中判题沙盒模块准备用消息队列来实现判题的并行化。下面是用docker来搭建和调试RocketMQ的过程</p>
<h2 id="安装-Namesrv"><a href="#安装-Namesrv" class="headerlink" ti
</summary>
<category term="docker" scheme="https://www.djangoz.com/categories/docker/"/>
<category term="运维" scheme="https://www.djangoz.com/tags/%E8%BF%90%E7%BB%B4/"/>
<category term="MQ" scheme="https://www.djangoz.com/tags/MQ/"/>
</entry>
<entry>
<title>mac高效使用合集(持续更新)</title>
<link href="https://www.djangoz.com/2019/03/21/mac/"/>
<id>https://www.djangoz.com/2019/03/21/mac/</id>
<published>2019-03-21T06:01:38.000Z</published>
<updated>2019-03-21T06:53:56.658Z</updated>
<content type="html"><![CDATA[<h2 id="item2-oh-my-zsh"><a href="#item2-oh-my-zsh" class="headerlink" title="item2+oh-my-zsh"></a>item2+oh-my-zsh</h2><p><a href="https://www.iterm2.com/" target="_blank" rel="noopener">item2官网</a></p><h3 id="item2"><a href="#item2" class="headerlink" title="item2:"></a>item2:</h3><ul><li>同tab多窗口 <ul><li>垂直排列 command + d</li><li>水平排列 command + shift + d</li><li>窗口间切换 command + [ (])</li><li>关闭当前窗口 command + w</li></ul></li></ul><h3 id="oh-my-zsh"><a href="#oh-my-zsh" class="headerlink" title="oh-my-zsh"></a>oh-my-zsh</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"</span><br></pre></td></tr></table></figure><ul><li>zshrc<ul><li>ZSH_THEME=”avit”</li><li>plugins=(git zsh-syntax-highlighting zsh-autosuggestions)</li></ul></li><li><p>zsh-syntax-highlighting安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting</span><br></pre></td></tr></table></figure></li><li><p>zsh-autosuggestions安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions</span><br></pre></td></tr></table></figure></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source ~/.zshrc</span><br></pre></td></tr></table></figure><p>当item2的主题是Solarized Dark时,会覆盖zsh-autosuggestions的提示字体,造成显示不了的情况<br><figure class="highlight shell"><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">▶ vim ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh</span><br><span class="line"></span><br><span class="line">: ${ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=2'}</span><br><span class="line"><span class="meta">#</span> 把fg的颜色从8改为其他颜色,只支持8种颜色,可参考zsh-autosuggestions文档</span><br></pre></td></tr></table></figure></p><h2 id="鼠标控制"><a href="#鼠标控制" class="headerlink" title="鼠标控制"></a>鼠标控制</h2><p>mac外接键盘无法用到触控板,外接鼠标的话,方向逻辑相反,<a href="https://github.com/Caldis/Mos" target="_blank" rel="noopener">Mos</a>很好解决了这个问题,而且可以控制鼠标的滚轮爽如触控板.</p><h3 id="鼠标箭头多屏幕切换"><a href="#鼠标箭头多屏幕切换" class="headerlink" title="鼠标箭头多屏幕切换"></a>鼠标箭头多屏幕切换</h3><p>在多屏幕工作时,经常要用手来操作鼠标箭头到另外一个屏幕,现用软件可实现快捷键切换到其他屏幕</p><p>先安装<a href="http://www.hammerspoon.org/" target="_blank" rel="noopener">Hammerspoon</a><br>open config</p><figure class="highlight lua"><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="comment">-- Set hyper to cmd</span></span><br><span class="line"><span class="keyword">local</span> hyper = {<span class="string">'cmd'</span>}</span><br><span class="line"></span><br><span class="line"><span class="comment">-- Move Mouse to center of next Monitor</span></span><br><span class="line">hs.hotkey.bind(hyper, <span class="string">'`'</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span></span></span><br><span class="line"> <span class="keyword">local</span> screen = hs.mouse.getCurrentScreen()</span><br><span class="line"> <span class="keyword">local</span> nextScreen = screen:<span class="built_in">next</span>()</span><br><span class="line"> <span class="keyword">local</span> rect = nextScreen:fullFrame()</span><br><span class="line"> <span class="keyword">local</span> center = hs.geometry.rectMidPoint(rect)</span><br><span class="line"> </span><br><span class="line"> hs.mouse.setAbsolutePosition(center)</span><br><span class="line"><span class="keyword">end</span>)</span><br></pre></td></tr></table></figure><p>此处将cmd定义为hyper,然后定义hyper+`为切换鼠标箭头到其他屏幕,也可自定义为其他快捷键</p><h2 id="窗口布局"><a href="#窗口布局" class="headerlink" title="窗口布局"></a>窗口布局</h2><p><a href="https://github.com/eczarny/spectacle" target="_blank" rel="noopener">spectacle</a></p><ul><li>移动窗口到到另外一个屏幕 ⌃⌥⌘→</li></ul><p>其他具体操作可参考文档</p><h2 id="mac神器Alfred"><a href="#mac神器Alfred" class="headerlink" title="mac神器Alfred"></a>mac神器Alfred</h2><h3 id="常用workflows"><a href="#常用workflows" class="headerlink" title="常用workflows"></a>常用workflows</h3><ul><li><a href="https://github.com/xudaolong/CodeVar" target="_blank" rel="noopener">CodeVar</a></li><li><a href="https://kapeli.com/dash" target="_blank" rel="noopener">Dash</a></li><li><a href="https://github.com/willfarrell/alfred-encode-decode-workflow" target="_blank" rel="noopener">Encode/Decode</a></li><li><a href="https://github.com/xfslove/alfred-google-translate" target="_blank" rel="noopener">Google Translate</a></li><li><a href="https://github.com/ngreenstein/alfred-process-killer" target="_blank" rel="noopener">Kill Process</a></li><li><a href="https://github.com/LeEnno/alfred-terminalfinder" target="_blank" rel="noopener">TerminalFinder</a></li><li><a href="https://github.com/WiconWang/Alfred-Workflows-TimeStamp" target="_blank" rel="noopener">Timestamp</a></li><li><a href="https://github.com/wensonsmith/YoudaoTranslate" target="_blank" rel="noopener">Youdao Translate</a></li></ul>]]></content>
<summary type="html">
<h2 id="item2-oh-my-zsh"><a href="#item2-oh-my-zsh" class="headerlink" title="item2+oh-my-zsh"></a>item2+oh-my-zsh</h2><p><a href="https://w
</summary>
<category term="技巧" scheme="https://www.djangoz.com/tags/%E6%8A%80%E5%B7%A7/"/>
</entry>
<entry>
<title>总结遇到的python2中的坑</title>
<link href="https://www.djangoz.com/2019/03/07/python2-pit/"/>
<id>https://www.djangoz.com/2019/03/07/python2-pit/</id>
<published>2019-03-07T12:56:10.000Z</published>
<updated>2019-03-08T08:57:49.857Z</updated>
<content type="html"><![CDATA[<p>很久没有更新博客了,由于来到字节跳动实习,最近一直都很忙没时间来写博客, 有些东西也不便透露出来</p><p>公司内部一般都是用的python和golang, 而python库又是用的pyhton2.7来写的,编码的途中经常遇到很多很多坑,而且很多还是相同的问题导致了不同的结果….</p><h3 id="编码错误"><a href="#编码错误" class="headerlink" title="编码错误"></a>编码错误</h3><p>用python2最恶心的一句话莫过于<br><code>UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)</code></p><p>python2不是默认utf-8编码…每个文件必须说明utf-8编码,不然py文件中遇到中文的话会直接出错</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># -*- coding: utf-8 -*-</span><br></pre></td></tr></table></figure><p>pycharm用户可以直接设置每次新增文件可以添加title.<br>设置->Editor->File and Code Templates -> Files -> Python Script<br>然后进行添加</p><p>在处理字符串时需要对中文字符进行unicode编码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">s = u'你好世界'</span><br></pre></td></tr></table></figure></p><p>输出含有中文的unicode字符的时候还要进行utf-8编码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print s.encode('utf-8')</span><br></pre></td></tr></table></figure></p><p>对于如果要把unicode字符转化为str时,需要把环境编码设置为utf-8<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></pre></td><td class="code"><pre><span class="line">import sys</span><br><span class="line">reload(sys).setdefaultencoding('utf8')</span><br><span class="line">print str(s)</span><br></pre></td></tr></table></figure></p><h3 id="去除字符串中所有空格"><a href="#去除字符串中所有空格" class="headerlink" title="去除字符串中所有空格"></a>去除字符串中所有空格</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">''.join(s.split())</span><br></pre></td></tr></table></figure><h3 id="储存dict的list到csv文件"><a href="#储存dict的list到csv文件" class="headerlink" title="储存dict的list到csv文件"></a>储存dict的list到csv文件</h3><p>有很多和dict需要存到csv里,以dict的keys作为csv的头<br><figure class="highlight python"><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"><span class="keyword">import</span> csv</span><br><span class="line">headers = [<span class="string">'name'</span>,<span class="string">'age'</span>]</span><br><span class="line">person_list = [{<span class="string">'name'</span>:<span class="string">'djangoz'</span>,<span class="string">'age'</span>:<span class="number">18</span>},{<span class="string">'name'</span>:<span class="string">'alice'</span>,<span class="string">'age'</span>:<span class="number">18</span>}]</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'file.csv'</span>,<span class="string">'w'</span>) <span class="keyword">as</span> csvfile:</span><br><span class="line"> csvwriter = csv.DictWriter(csvfile, fieldnames=headers)</span><br><span class="line"> csvwriter.writeheader()</span><br><span class="line"> <span class="keyword">for</span> person <span class="keyword">in</span> person_list:</span><br><span class="line"> csvwriter.writerow(person)</span><br></pre></td></tr></table></figure></p><p>然后file.csv文件就是这样了<br><figure class="highlight shell"><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">▶ cat file.csv</span><br><span class="line">name,age</span><br><span class="line">djangoz,18</span><br><span class="line">alice,18</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>很久没有更新博客了,由于来到字节跳动实习,最近一直都很忙没时间来写博客, 有些东西也不便透露出来</p>
<p>公司内部一般都是用的python和golang, 而python库又是用的pyhton2.7来写的,编码的途中经常遇到很多很多坑,而且很多还是相同的问题导致了不同
</summary>
<category term="python" scheme="https://www.djangoz.com/categories/python/"/>
</entry>
<entry>
<title>本地mysql数据库搬迁到docker</title>
<link href="https://www.djangoz.com/2018/12/26/dockermysql/"/>
<id>https://www.djangoz.com/2018/12/26/dockermysql/</id>
<published>2018-12-26T06:54:26.000Z</published>
<updated>2019-01-04T14:02:26.000Z</updated>
<content type="html"><![CDATA[<p>最近慢慢熟悉了docker,打算将一些开发环境搬迁到docker容器里面便于管理和备份。</p><p>docker安装部分就不介绍了,可看<a href="https://docs.docker.com/install/" target="_blank" rel="noopener">官方文档</a></p><h2 id="1-下载mysql镜像"><a href="#1-下载mysql镜像" class="headerlink" title="1.下载mysql镜像"></a>1.下载mysql镜像</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull mysql:8.0</span><br></pre></td></tr></table></figure><p>下载的版本为8.0的mysql</p><h2 id="2-创建容器"><a href="#2-创建容器" class="headerlink" title="2. 创建容器"></a>2. 创建容器</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -p 3306:3306 --restart=always -name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0</span><br></pre></td></tr></table></figure><p>创建容器,将容器的3306端口映射到本地的3306端口,设置为docker启动时容器自启动,命名为mysql,设置数据库密码为root</p><h2 id="3-导出本地数据库"><a href="#3-导出本地数据库" class="headerlink" title="3.导出本地数据库"></a>3.导出本地数据库</h2><p>将本地mysql的数据库导出为sql文件<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysqldump -u root -p you_database > you_database.sql</span><br></pre></td></tr></table></figure></p><h2 id="4-将导出的sql文件复制到docker容器里"><a href="#4-将导出的sql文件复制到docker容器里" class="headerlink" title="4.将导出的sql文件复制到docker容器里"></a>4.将导出的sql文件复制到docker容器里</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker cp you_database.sql mysql:/opt/</span><br></pre></td></tr></table></figure><p>此时sql文件就到mysql容器里的/opt/路径里面了。<br>然后进入容器里面操作<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it mysql bash</span><br></pre></td></tr></table></figure></p><p>此时就进入到容器里面了,先在容器里面的mysql创建相应的数据库<br><br><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">▶ docker exec -it mymysql bash</span><br><span class="line">root@19820b3cb9b8:/# mysql -u root -p</span><br><span class="line">Enter password:</span><br><span class="line">Welcome to the MySQL monitor. Commands end with ; or \g.</span><br><span class="line">Your MySQL connection id is 13</span><br><span class="line">Server version: 8.0.13 MySQL Community Server - GPL</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.</span><br><span class="line"></span><br><span class="line">Oracle is a registered trademark of Oracle Corporation and/or its</span><br><span class="line">affiliates. Other names may be trademarks of their respective</span><br><span class="line">owners.</span><br><span class="line"></span><br><span class="line">Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</span><br><span class="line"></span><br><span class="line"><span class="meta">mysql></span> create database YOU_DATABASE;</span><br></pre></td></tr></table></figure></p><p>创建完相应的数据库后,就可以导入之前复制到容器里面的sql文件了。<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root@19820b3cb9b8:/# mysql -u root -p YOUDATABASE < /opt/you_database.sql</span><br></pre></td></tr></table></figure></p><p>此时就大功告成了,然后就可以卸载本地的mysql,达成删库跑路成就了。<br><figure class="highlight shell"><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">▶ brew remove mysql</span><br><span class="line">Uninstalling /usr/local/Cellar/mysql/8.0.12... (257 files, 233.2MB)</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>最近慢慢熟悉了docker,打算将一些开发环境搬迁到docker容器里面便于管理和备份。</p>
<p>docker安装部分就不介绍了,可看<a href="https://docs.docker.com/install/" target="_blank" rel="noo
</summary>
<category term="docker" scheme="https://www.djangoz.com/categories/docker/"/>
<category term="运维" scheme="https://www.djangoz.com/tags/%E8%BF%90%E7%BB%B4/"/>
</entry>
<entry>
<title>Servlet/JSP简单生成图片验证码并后台验证功能</title>
<link href="https://www.djangoz.com/2018/11/18/verifycode/"/>
<id>https://www.djangoz.com/2018/11/18/verifycode/</id>
<published>2018-11-18T07:45:15.000Z</published>
<updated>2018-12-06T03:26:52.000Z</updated>
<content type="html"><![CDATA[<p>最近在学用JAVA Servlet/JSP来开发web应用,于是练手来做一个通过Servlet后台来生成图片验证码,并实现验证功能。</p><h2 id="实现思路"><a href="#实现思路" class="headerlink" title="实现思路"></a><a href="#实现思路" title="实现思路"></a>实现思路</h2><p>先用单例模式写一个生成验证码图片的GenerateCode类,该类的createImage()方法返回BufferImage类,然后用Servlet来读取图片,GenerateCode对象在生成图片的同时也会生成一个验证码的字符串,可供后台验证的Servlet来验证前台post上去的验证码是否相同.</p><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181117-124805.png" alt=""> </div> <div class="image-caption"></div> </figure><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181117-124831.png" alt=""> </div> <div class="image-caption"></div> </figure><h2 id="实现代码"><a href="#实现代码" class="headerlink" title="实现代码"></a><a href="#实现代码" title="实现代码"></a>实现代码</h2><h3 id="Servlet类"><a href="#Servlet类" class="headerlink" title="Servlet类"></a><a href="#Servlet类" title="Servlet类"></a>Servlet类</h3><ul><li>VerifyCode.java(显示验证码图片)<figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> Utils.GenerateCode;</span><br><span class="line"><span class="keyword">import</span> com.sun.image.codec.jpeg.JPEGCodec;</span><br><span class="line"><span class="keyword">import</span> com.sun.image.codec.jpeg.JPEGImageEncoder;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletException;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet</span>(<span class="string">“/VerifyCode.do”</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">VerifyCode</span> <span class="keyword">extends</span> <span class="title">HttpServlet</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">processRequest</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> </span>{</span><br><span class="line"> resp.setContentType(<span class="string">“image/jpg”</span>);</span><br><span class="line"> GenerateCode generateCode = GenerateCode.getInstance();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> OutputStream outputStream = resp.getOutputStream();</span><br><span class="line"> JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);</span><br><span class="line"> encoder.encode(generateCode.createImage());</span><br><span class="line"> outputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">doGet</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException </span>{</span><br><span class="line"> processRequest(req, resp);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">doPost</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException </span>{</span><br><span class="line"> processRequest(req, resp);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li>Verify.java(验证post上来的验证码)<figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> Utils.GenerateCode;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletException;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="meta">@WebServlet</span>(<span class="string">“/Verify.do”</span>)</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Verify</span> <span class="keyword">extends</span> <span class="title">HttpServlet</span> </span>{</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">doPost</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException </span>{</span><br><span class="line"> resp.setContentType(<span class="string">“text/html;charset=UTF-8”</span>);</span><br><span class="line"> String reallycode = GenerateCode.getInstance().getCode();</span><br><span class="line"> String postcode = req.getParameter(<span class="string">“verifycode”</span>);</span><br><span class="line"> <span class="keyword">if</span>(reallycode.equalsIgnoreCase(postcode)){</span><br><span class="line"> req.getRequestDispatcher(<span class="string">“success.jsp”</span>).forward(req,resp);</span><br><span class="line"> }<span class="keyword">else</span></span><br><span class="line"> resp.sendRedirect(<span class="string">“index.jsp”</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><h3 id="Utils"><a href="#Utils" class="headerlink" title="Utils"></a><a href="#Utils" title="Utils"></a>Utils</h3><ul><li>GenerateCode.java(生成验证码图片和字符串)<figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> Utils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">GenerateCode</span></span>{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> PW = <span class="number">70</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> PH = <span class="number">35</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Random random = <span class="keyword">new</span> Random();</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> String[] fontnames = {<span class="string">“Chalkboard”</span>,<span class="string">“Cochin”</span>,<span class="string">“Skia”</span>,<span class="string">“Apple Symbols”</span>};</span><br><span class="line"> <span class="keyword">private</span> String codes=<span class="string">“012345678901234567890123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Color bgColor = Color.BLACK;</span><br><span class="line"> <span class="keyword">private</span> String code;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">volatile</span> <span class="keyword">static</span> GenerateCode generateCode;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> GenerateCode <span class="title">getInstance</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">if</span>(generateCode ==<span class="keyword">null</span>){</span><br><span class="line"> <span class="keyword">synchronized</span> (GenerateCode.class){</span><br><span class="line"> <span class="keyword">if</span>(generateCode ==<span class="keyword">null</span>){</span><br><span class="line"> generateCode = <span class="keyword">new</span> GenerateCode();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> generateCode;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getCode</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setCode</span><span class="params">(String code)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.code = code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> Color <span class="title">randomColor</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> Color(random.nextInt(<span class="number">150</span>),random.nextInt(<span class="number">150</span>),random.nextInt(<span class="number">150</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> Font <span class="title">randomFont</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">int</span> index = random.nextInt(fontnames.length);</span><br><span class="line"> String fontname = fontnames[index];</span><br><span class="line"> <span class="keyword">int</span> style = random.nextInt(<span class="number">4</span>);</span><br><span class="line"> <span class="keyword">int</span> size = random.nextInt(<span class="number">5</span>) + <span class="number">25</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> Font(fontname,style,size);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> String <span class="title">randomCode</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">int</span> len = codes.length();</span><br><span class="line"> String code = <span class="string">“”</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> <span class="keyword">int</span> a = random.nextInt(len);</span><br><span class="line"> code += codes.charAt(a);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> BufferedImage <span class="title">createImage</span><span class="params">()</span></span>{</span><br><span class="line"> BufferedImage image = <span class="keyword">new</span> BufferedImage(PW,PH,BufferedImage.TYPE_INT_BGR);</span><br><span class="line"> Graphics g = image.getGraphics();</span><br><span class="line"> g.setColor(bgColor);</span><br><span class="line"> g.fillRect(<span class="number">0</span>,<span class="number">0</span>,PW,PH);</span><br><span class="line"> String num = randomCode();</span><br><span class="line"> <span class="keyword">this</span>.setCode(num);</span><br><span class="line"> g.setColor(randomColor());</span><br><span class="line"> g.setFont(randomFont());</span><br><span class="line"> g.drawString(num,<span class="number">0</span>,<span class="number">25</span>);</span><br><span class="line"> <span class="keyword">return</span> image;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><h3 id="jsp"><a href="#jsp" class="headerlink" title="jsp"></a><a href="#jsp" title="jsp"></a>jsp</h3><ul><li><p>index.jsp<figure class="highlight"><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"><%@ page <span class="keyword">import</span>=<span class="string">“java.awt.image.BufferedImage”</span> %></span><br><span class="line"><%@ page <span class="keyword">import</span>=<span class="string">“servlet.VerifyCode”</span> %><%–</span><br><span class="line"> Created by IntelliJ IDEA.</span><br><span class="line"> User: onlyless</span><br><span class="line"> Date: <span class="number">11</span>/<span class="number">17</span>/<span class="number">18</span></span><br><span class="line"> Time: <span class="number">11</span>:<span class="number">34</span></span><br><span class="line"> To change <span class="keyword">this</span> template use File | Settings | File Templates.</span><br><span class="line">–%></span><br><span class="line"><%@ page contentType=<span class="string">“text/html;charset=UTF-8”</span> language=<span class="string">“java”</span> %></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <title>Title</title></span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line"><form action=<span class="string">“/Verify.do”</span> method=<span class="string">“post”</span>></span><br><span class="line"> <table></span><br><span class="line"> <tr></span><br><span class="line"> <td></span><br><span class="line"> <img src=<span class="string">“/VerifyCode.do”</span>></span><br><span class="line"> <input type=<span class="string">“text”</span> name=<span class="string">“verifycode”</span> maxlength=<span class="string">“4”</span>></span><br><span class="line"> <input type=<span class="string">“submit”</span> name=<span class="string">“submit”</span>></span><br><span class="line"> </td></span><br><span class="line"> </tr></span><br><span class="line"> </table></span><br><span class="line"></form></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure></p></li><li><p>success.jsp<figure class="highlight"><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></pre></td><td class="code"><pre><span class="line"><%–</span><br><span class="line"> Created by IntelliJ IDEA.</span><br><span class="line"> User: onlyless</span><br><span class="line"> Date: <span class="number">11</span>/<span class="number">16</span>/<span class="number">18</span></span><br><span class="line"> Time: <span class="number">16</span>:<span class="number">46</span></span><br><span class="line"> To change <span class="keyword">this</span> template use File | Settings | File Templates.</span><br><span class="line">–%></span><br><span class="line"><%@ page contentType=<span class="string">“text/html;charset=UTF-8”</span> language=<span class="string">“java”</span> %></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <title>success</title></span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line"><h1>success</h1></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure></p></li></ul><h2 id="不足"><a href="#不足" class="headerlink" title="不足"></a><a href="#不足" title="不足"></a>不足</h2><p>思路很简单,最终也实现出来了,但是我发现了一个BUG,在多个窗口同时请求验证时,由于后台很简单的读取GenerateCode的验证码,因此这多个窗口post上来的验证码就算全部都是正确的,但是只能验证最后生成验证码图片的那个post,要解决这个问题,我想应该要用到Cookie的知识,现在还在学习,待以后再解决这个问题。</p><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181118-1446082.jpg" alt=""> </div> <div class="image-caption"></div> </figure><br>后台查看验证码不一致,后台正确的验证码是最后生成的验证码,导致之前的生成的验证码提交上去不匹配<br><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181118-144626.jpg" alt=""> </div> <div class="image-caption"></div> </figure><h2 id="后续"><a href="#后续" class="headerlink" title="后续"></a><a href="#后续" title="后续"></a>后续</h2><p>第二天学到了Cookie和Session的运用,发现用Session很简单就能解决上面的那个不足。</p><ul><li>VerifyCode.java<figure class="highlight java"><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><br><span class="line">JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);</span><br><span class="line">encoder.encode(generateCode.createImage());</span><br><span class="line">req.getSession().setAttribute(<span class="string">“verify”</span>,generateCode.getCode()); <span class="comment">//添加的代码</span></span><br><span class="line">outputStream.close();</span><br><span class="line">…</span><br></pre></td></tr></table></figure></li><li>Verify.java<figure class="highlight java"><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><br><span class="line"> resp.setContentType(<span class="string">“text/html;charset=UTF-8”</span>);</span><br><span class="line"><span class="comment">// String reallycode = GenerateCode.getInstance().getCode();</span></span><br><span class="line"> String reallycode = (String) req.getSession().getAttribute(<span class="string">“verify”</span>); <span class="comment">//修改的代码</span></span><br><span class="line"> String postcode = req.getParameter(<span class="string">“verifycode”</span>);</span><br><span class="line"> System.out.println(reallycode + <span class="string">“—“</span> + postcode);</span><br><span class="line"> ….</span><br></pre></td></tr></table></figure></li></ul><p>两个浏览器同时登陆都成功登陆,后台查看验证码一致</p><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181118-1448252.jpg" alt=""> </div> <div class="image-caption"></div> </figure><br><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181118-144846.jpg" alt=""> </div> <div class="image-caption"></div> </figure><br><figure class="image-bubble"> <div class="img-lightbox"> <div class="overlay"></div> <img src="/img/20181118-150944.jpg" alt=""> </div> <div class="image-caption"></div> </figure><p>不过我发现这个问题在同一个浏览器上还是存在,原因很简单,用一个浏览器不同窗口的Session都是一样的,这样就导致新生成的验证码覆盖掉以前Session绑定的验证码,导致问题产生,这个问题我测试了一下学校的教务系统和12306的登录验证码,都存在这样的问题。不过这个一般谁也不会同时开多个窗口登录,登录失败一个,换以前的窗口登录,这样导致一直匹配到的不是产生最新的验证码。</p>]]></content>
<summary type="html">
<p>最近在学用JAVA Servlet/JSP来开发web应用,于是练手来做一个通过Servlet后台来生成图片验证码,并实现验证功能。</p>
<h2 id="实现思路"><a href="#实现思路" class="headerlink" title="实现思路"></a>
</summary>
<category term="java" scheme="https://www.djangoz.com/categories/java/"/>
<category term="应用" scheme="https://www.djangoz.com/tags/%E5%BA%94%E7%94%A8/"/>
<category term="web" scheme="https://www.djangoz.com/tags/web/"/>
<category term="Servlet/JSP" scheme="https://www.djangoz.com/tags/Servlet-JSP/"/>
</entry>
<entry>
<title>职业的乐趣</title>
<link href="https://www.djangoz.com/2018/11/02/funnywork/"/>
<id>https://www.djangoz.com/2018/11/02/funnywork/</id>
<published>2018-11-02T11:15:27.000Z</published>
<updated>2018-12-06T03:28:02.000Z</updated>
<content type="html"><![CDATA[<p>今天在<a href="https://book.douban.com/subject/2230248/" target="_blank" rel="noopener">人月神话</a>里看到的,觉得说得挺好的,就摘抄下来</p><blockquote><p> 首先,这种快乐是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到快乐一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特的、崭新的树叶和雪花上的喜悦。<br> 其次,这种快乐来自于开发对他人有用的东西。内心深处,我们期望我们的劳动成果能够被他人使用,并能对他们有所帮助。从这一角度而言,这同小孩用粘土为“爸爸的办公室”捏制铅笔盒没有任何本质的区别。<br> 第三,快乐来自于整个过程体现出的一股强大的魅力—将相互啮合的零部件组装在一起,看到它们以精妙的方式运行着,并收到了预期的效果。比起弹球游戏机或自动电唱机所具有的迷人魅力,程序化的计算机毫不逊色。<br> 第四,这种快乐是持续学习的快乐,它来自于这项工作的非重复特性。人们所面临的问题总有这样那样的不同,因而解决问题的人可以从中学习新的事物,有时是实践上的,有时是理论上的,或者兼而有之。<br> 最后,这种快乐还来自于在易于驾驭的介质上工作。程序员,就像诗人一样,几乎仅仅在单纯的思考中工作。程序员凭空地运用自己的想象,来建造自己的“城堡”。很少有创造介质如此灵活,如此易于精炼和重建,如此容易实现概念上的设想(不过我们将会看到,容易驾驭的特性也有它自己的问题)<br> 然而程序毕竟同诗歌不同,它是实实在在的东西;它可以移动和运行,能独立产生可见的输出;它能打印结果,绘制图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已变成现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的也不可能存在的事物。</p></blockquote>]]></content>
<summary type="html">
<p>今天在<a href="https://book.douban.com/subject/2230248/" target="_blank" rel="noopener">人月神话</a>里看到的,觉得说得挺好的,就摘抄下来</p>
<blockquote>
<p>&emsp
</summary>
<category term="闲言碎语" scheme="https://www.djangoz.com/tags/%E9%97%B2%E8%A8%80%E7%A2%8E%E8%AF%AD/"/>
<category term="读书笔记" scheme="https://www.djangoz.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
</entry>
<entry>
<title>UEFI+GPT修复win10EFI开机启动</title>
<link href="https://www.djangoz.com/2018/10/23/win10uefi/"/>
<id>https://www.djangoz.com/2018/10/23/win10uefi/</id>
<published>2018-10-23T02:39:32.000Z</published>
<updated>2018-12-06T03:28:26.000Z</updated>
<content type="html"><![CDATA[<p>最近入手了三星sm951-SSD,把黑苹果和win10一起迁移到这个盘上来,结果只记起备份CLOVER,没有备份win10的启动项了,然后迁移过后EFI引导只有CLOVER了,由于已经把win10的整个分区移过来了,不想重装系统,想试试修复一下win10d EFI文件,理论上应该可行</p><p>EFI文件都在磁盘的ESP分区,先挂载ESP分区,然后用ms-dos自带的修复工具即可修复</p><p>准备工作:一个有原装winPE的u盘</p><ol><li>开机进入u盘后,在含有现在安装和修复计算机界面那里,按shift+F10,进入命令行界面。</li><li>运行以下命令行<figure class="highlight cmd"><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></pre></td><td class="code"><pre><span class="line">diskpart #进入diskpart</span><br><span class="line">list disk # 查看磁盘</span><br><span class="line">select disk n # n->代表ESP分区所在的磁盘(<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>…n)</span><br><span class="line">list partition #查看选择的磁盘含有的分区</span><br><span class="line">select partition n # n->选择ESP分区</span><br><span class="line">assign letter=b #将ESP分区挂载为B盘</span><br><span class="line"><span class="keyword">exit</span> #退出diskpart</span><br><span class="line">bcdboot C:\windows /s B: /f uefi /l zh-cn #C:\windows代表windows所在的分区在C盘,不同的情况可能会改变,找到系统所在的盘符即可</span><br></pre></td></tr></table></figure></li></ol>]]></content>
<summary type="html">
<p>最近入手了三星sm951-SSD,把黑苹果和win10一起迁移到这个盘上来,结果只记起备份CLOVER,没有备份win10的启动项了,然后迁移过后EFI引导只有CLOVER了,由于已经把win10的整个分区移过来了,不想重装系统,想试试修复一下win10d EFI文件,理论
</summary>
<category term="折腾" scheme="https://www.djangoz.com/tags/%E6%8A%98%E8%85%BE/"/>
<category term="系统" scheme="https://www.djangoz.com/tags/%E7%B3%BB%E7%BB%9F/"/>
</entry>
<entry>
<title>hdu1560DNA sequence(IDA*搜索)</title>
<link href="https://www.djangoz.com/2018/10/20/hdu1560/"/>
<id>https://www.djangoz.com/2018/10/20/hdu1560/</id>
<published>2018-10-20T02:38:29.000Z</published>
<updated>2018-12-06T03:17:22.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=1560" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>给定N个DNA字符串,找到最短的字符串使N个字符串都是它的子序列(不连续)</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>又是典型的IDA* 迭代加深搜索思路,用一个数组保存每次搜索到对于N个字符串的下标,当每个下标都到了字符串的结尾的时候即说明解出了答案。<br>为防止超时,当此时深度+至少还要加深的深度>限制值时就返回上一层状态。</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">char</span> dc[] = {<span class="string">‘A’</span>,<span class="string">‘T’</span>,<span class="string">‘G’</span>,<span class="string">‘C’</span>};</span><br><span class="line"><span class="built_in">string</span> s[<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">idastar</span><span class="params">(<span class="keyword">int</span> step,<span class="keyword">int</span> <em>dex,<span class="keyword">int</span> top)</em></span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">bool</span> yes = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span> min_len = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="keyword">int</span> len = s[i].size();</span><br><span class="line"> <span class="keyword">if</span>(dex[i] != len){</span><br><span class="line"> yes = <span class="number">0</span>;</span><br><span class="line"> min_len = max(min_len,len - dex[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(yes)<span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">if</span>(min_len + step > top) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> <span class="keyword">char</span> c = dc[i];</span><br><span class="line"> <span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> pos[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<n;j++){</span><br><span class="line"> <span class="keyword">int</span> len = s[j].size();</span><br><span class="line"> <span class="keyword">if</span>(dex[j]!= len){</span><br><span class="line"> <span class="keyword">if</span> (c == s[j][dex[j]]){</span><br><span class="line"> cnt++;</span><br><span class="line"> pos[j] = dex[j]+<span class="number">1</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> pos[j] = dex[j];</span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> pos[j] = dex[j];</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(cnt==<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(step <= top){</span><br><span class="line"> <span class="keyword">bool</span> ok = idastar(step + <span class="number">1</span>,pos, top);</span><br><span class="line"> <span class="keyword">if</span> (ok)</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ios::sync_with_stdio(<span class="literal">false</span>);</span><br><span class="line"> <span class="built_in">cin</span>.tie(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> <span class="keyword">while</span>(T–){</span><br><span class="line"> <span class="built_in">cin</span> >> n;</span><br><span class="line"> <span class="keyword">size_t</span> top = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> s[i];</span><br><span class="line"> top = max(s[i].length(),top);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> dex[<span class="number">100</span>];</span><br><span class="line"> <span class="keyword">while</span>(top){</span><br><span class="line"> <span class="built_in">memset</span>(dex,<span class="number">0</span>,<span class="keyword">sizeof</span>(dex));</span><br><span class="line"> <span class="keyword">if</span>(idastar(<span class="number">0</span>,dex,top))<span class="keyword">break</span>;</span><br><span class="line"> top++;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cout</span> << top << <span class="built_in">endl</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=1560" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>hdu2102A计划(三维bfs)</title>
<link href="https://www.djangoz.com/2018/10/18/hdu2102/"/>
<id>https://www.djangoz.com/2018/10/18/hdu2102/</id>
<published>2018-10-18T08:19:04.000Z</published>
<updated>2018-12-06T03:16:46.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=2102" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>在一个两层迷宫内,骑士从起点是否能在给定步数之内找到公主,’#’代表传送门,会传送到另一个平面该位置去,’*’代表墙,’P’代表公主</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>水题,用bfs模拟即可,就是有个坑 传送门被传到的位置不能是墙(由题意)和传送门(会造成无限传送)</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">15</span>;</span><br><span class="line"><span class="keyword">int</span> N,M,S;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> x,y,z;</span><br><span class="line"> <span class="keyword">int</span> step;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">char</span> G[<span class="number">2</span>][maxn][maxn];;</span><br><span class="line"><span class="keyword">bool</span> vis[<span class="number">2</span>][maxn][maxn];</span><br><span class="line"><span class="keyword">bool</span> ok = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> dx[] = {<span class="number">1</span>,<span class="number">0</span>,<span class="number">-1</span>,<span class="number">0</span>};</span><br><span class="line"><span class="keyword">int</span> dy[] = {<span class="number">0</span>,<span class="number">1</span>,<span class="number">0</span>,<span class="number">-1</span>};</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bfs</span><span class="params">(Node beg)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">queue</span><Node> Q;</span><br><span class="line"> Q.push(beg);</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> Node t = Q.front();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">if</span>(t.step > S)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(G[t.z][t.x][t.y]==<span class="string">‘P’</span>){</span><br><span class="line"> ok = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> ;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> <span class="keyword">int</span> nx = t.x + dx[i];</span><br><span class="line"> <span class="keyword">int</span> ny = t.y + dy[i];</span><br><span class="line"> <span class="keyword">int</span> nz = t.z;</span><br><span class="line"> <span class="keyword">if</span>(nx<<span class="number">0</span>||ny<<span class="number">0</span>||ny>=M||nx>=N)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(G[nz][nx][ny]==<span class="string">‘<em>‘</em></span>)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(vis[nz][nx][ny])<span class="keyword">continue</span>;</span><br><span class="line"> vis[nz][nx][ny] = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span>(G[nz][nx][ny]==<span class="string">‘#’</span>&&G[nz^<span class="number">1</span>][nx][ny]!=<span class="string">‘‘</span>&&G[nz^<span class="number">1</span>][nx][ny]!=<span class="string">‘#’</span>){</span><br><span class="line"> Q.push((Node){nx,ny,nz^<span class="number">1</span>,t.step+<span class="number">1</span>});</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(G[nz][nx][ny]!=<span class="string">‘#’</span>)</span><br><span class="line"> Q.push((Node){nx,ny,nz,t.step+<span class="number">1</span>});</span><br><span class="line"> }</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">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> <span class="keyword">while</span>(T–){</span><br><span class="line"> ok = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> <span class="built_in">cin</span> >> N >> M >> S;</span><br><span class="line"> Node beg;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k < <span class="number">2</span>; k++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < N; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < M; j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">cin</span> >> G[k][i][j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> beg = (Node){<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>};</span><br><span class="line"> bfs(beg);</span><br><span class="line"> <span class="keyword">if</span>(ok){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“YES”</span> << <span class="built_in">endl</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“NO”</span> << <span class="built_in">endl</span>;</span><br><span class="line"> }</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=2102" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>poj2248Addition Chains(IDA*搜索)</title>
<link href="https://www.djangoz.com/2018/10/16/poj2248/"/>
<id>https://www.djangoz.com/2018/10/16/poj2248/</id>
<published>2018-10-16T04:34:21.000Z</published>
<updated>2018-12-06T03:26:20.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://poj.org/problem?id=2248" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>f[0] = 1,f[1] = 2<br>f[k] = f[i] + f[j] (0<=i,j<==k-1)<br>求当n = f[k] 时,输出前k项 (k最小时)</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>典型的IDA*算法,K从1开始枚举,当k可行时,结束搜索.<br>很容易发现f[k]是递增的,所以当搜索深度为step时,f[step] = f[1…step-1] + f[step-1],这样就很快地会搜索出解.</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> sta[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">idastar</span><span class="params">(<span class="keyword">int</span> n,<span class="keyword">int</span> step,<span class="keyword">int</span> top)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<step;i++){</span><br><span class="line"> <span class="keyword">int</span> k = sta[i]+ sta[step<span class="number">-1</span>];</span><br><span class="line"> <span class="keyword">if</span>(k==n){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<step;i++){</span><br><span class="line"> <span class="built_in">cout</span> << sta[i];</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“ “</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cout</span> << k << <span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(step < top){</span><br><span class="line"> sta[step] = k;</span><br><span class="line"> <span class="keyword">bool</span> ok = idastar(n,step+<span class="number">1</span>,top);</span><br><span class="line"> <span class="keyword">if</span>(ok)<span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(<span class="built_in">cin</span> >> n,n){</span><br><span class="line"> <span class="keyword">int</span> top = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span>(n==<span class="number">1</span>){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“1”</span> << <span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(n==<span class="number">2</span>){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“1 2”</span> << <span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> sta[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line"> sta[<span class="number">1</span>] = <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">while</span>(++top){</span><br><span class="line"> <span class="keyword">if</span>(idastar(n,<span class="number">2</span>,top))<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"> <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">
<p><a href="http://poj.org/problem?id=2248" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="headerlink" title="
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>hdu3567Eight II(八数码,IDA*)</title>
<link href="https://www.djangoz.com/2018/10/14/hdu3567/"/>
<id>https://www.djangoz.com/2018/10/14/hdu3567/</id>
<published>2018-10-14T07:52:03.000Z</published>
<updated>2018-12-06T03:17:48.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3567" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>八数码问题,不过目标状态不定,保证有解</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>和上一题类似,先算一下目标状态在跑IDA*即可,剪枝条件与上一题相同<br><a href="https://www.djangoz.com/2018/10/14/hdu3567/">参考</a></p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> goal[<span class="number">10</span>][<span class="number">2</span>];</span><br><span class="line"><span class="keyword">int</span> G[<span class="number">10</span>][<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> dx[] = {<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>};</span><br><span class="line"><span class="keyword">int</span> dy[] = {<span class="number">0</span>,<span class="number">-1</span>,<span class="number">1</span>,<span class="number">0</span>};</span><br><span class="line"><span class="keyword">char</span> dir[] = {<span class="string">‘d’</span>,<span class="string">‘l’</span>,<span class="string">‘r’</span>,<span class="string">‘u’</span>};</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">manhattan</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> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">3</span>;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<<span class="number">3</span>;j++){</span><br><span class="line"> <span class="keyword">int</span> w = G[i][j];</span><br><span class="line"> <span class="keyword">if</span>(w==<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> sum += <span class="built_in">abs</span>(goal[w][<span class="number">0</span>] - i) + <span class="built_in">abs</span>(goal[w][<span class="number">1</span>] - j);</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><span class="line"><span class="keyword">char</span> sta[<span class="number">500</span>];</span><br><span class="line"><span class="keyword">bool</span> flag = <span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">idastar</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y,<span class="keyword">int</span> pre,<span class="keyword">int</span> step,<span class="keyword">int</span> top)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(flag)<span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> <span class="keyword">if</span>(flag)<span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">int</span> nx = x + dx[i];</span><br><span class="line"> <span class="keyword">int</span> ny = y + dy[i];</span><br><span class="line"> <span class="keyword">if</span>(nx > <span class="number">2</span>||ny><span class="number">2</span>||nx < <span class="number">0</span>||ny<<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(pre + i == <span class="number">3</span>)<span class="keyword">continue</span>;</span><br><span class="line"> swap(G[x][y],G[nx][ny]);</span><br><span class="line"> <span class="keyword">int</span> mht = manhattan();</span><br><span class="line"> <span class="keyword">if</span>(mht==<span class="number">0</span>){</span><br><span class="line"> <span class="built_in">cout</span> << step+<span class="number">1</span> << <span class="built_in">endl</span>;</span><br><span class="line"> sta[step] = dir[i];</span><br><span class="line"> <span class="built_in">cout</span> << sta << <span class="built_in">endl</span>;</span><br><span class="line"> flag = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(mht + step <= top){</span><br><span class="line"> <span class="keyword">if</span>(flag) <span class="keyword">return</span>;</span><br><span class="line"> sta[step] = dir[i];</span><br><span class="line"> idastar(nx,ny,i,step+<span class="number">1</span>,top);</span><br><span class="line"> }</span><br><span class="line"> swap(G[x][y],G[nx][ny]);</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">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> <span class="keyword">int</span> Case = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span>(T–){</span><br><span class="line"> <span class="built_in">memset</span>(sta,<span class="number">0</span>,<span class="keyword">sizeof</span>(sta));</span><br><span class="line"> <span class="built_in">string</span> s1,s2;</span><br><span class="line"> <span class="built_in">cin</span> >> s1 >> s2;</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“Case “</span> << Case++ << <span class="string">“: “</span>;</span><br><span class="line"> <span class="keyword">if</span>(s1==s2){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“0”</span> << <span class="built_in">endl</span>;</span><br><span class="line"> <span class="built_in">cout</span> <<<span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> flag = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> bx,by;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<s1.length();i++){</span><br><span class="line"> <span class="keyword">if</span>(s1[i]==<span class="string">‘X’</span>){</span><br><span class="line"> G[i/<span class="number">3</span>][i%<span class="number">3</span>] = <span class="number">0</span>;</span><br><span class="line"> bx = i/<span class="number">3</span>;</span><br><span class="line"> by = i%<span class="number">3</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> G[i/<span class="number">3</span>][i%<span class="number">3</span>] = s1[i]-<span class="string">‘0’</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<s2.length();i++){</span><br><span class="line"> <span class="keyword">int</span> w = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span>(s2[i]==<span class="string">‘X’</span>){</span><br><span class="line"> w = <span class="number">0</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> w = s2[i]-<span class="string">‘0’</span>;</span><br><span class="line"> }</span><br><span class="line"> goal[w][<span class="number">0</span>] = i/<span class="number">3</span>;</span><br><span class="line"> goal[w][<span class="number">1</span>] = i%<span class="number">3</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> top = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(++top){</span><br><span class="line"> idastar(bx,by,<span class="number">-1</span>,<span class="number">0</span>,top);</span><br><span class="line"> <span class="keyword">if</span>(flag)</span><br><span class="line"> <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"> <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">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3567" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>hdu1043Eight(八数码,IDA*)</title>
<link href="https://www.djangoz.com/2018/10/14/hdu1043/"/>
<id>https://www.djangoz.com/2018/10/14/hdu1043/</id>
<published>2018-10-14T07:45:52.000Z</published>
<updated>2018-12-06T03:16:54.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=1043" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>经典的八数码的题目,还要判断是否有解,wiki<a href="https://zh.wikipedia.org/wiki/%E6%95%B8%E5%AD%97%E6%8E%A8%E7%9B%A4%E9%81%8A%E6%88%B2" target="_blank" rel="noopener">链接</a></p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>用IDA*算法来解决,先算出当前状态和目标状态的哈曼顿距离,当距离为0时即解出答案。<br>有两个可以剪枝的条件:</p><ul><li>下一个方向和当前的方向不能相反</li><li>当前的步数加上当前的哈曼顿距离不能大于初始状态的哈曼顿距离</li></ul><p>关于8数码是否有解,可参考<a href="https://www.geeksforgeeks.org/check-instance-8-puzzle-solvable/" target="_blank" rel="noopener">这篇文章</a></p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> goal[<span class="number">10</span>][<span class="number">2</span>] = {{<span class="number">2</span>,<span class="number">2</span>},{<span class="number">0</span>,<span class="number">0</span>},{<span class="number">0</span>,<span class="number">1</span>},{<span class="number">0</span>,<span class="number">2</span>}, {<span class="number">1</span>, <span class="number">0</span>}, {<span class="number">1</span>, <span class="number">1</span>}, {<span class="number">1</span>, <span class="number">2</span>}, {<span class="number">2</span>, <span class="number">0</span>}, {<span class="number">2</span>, <span class="number">1</span>}};</span><br><span class="line"><span class="keyword">int</span> G[<span class="number">10</span>][<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> dx[] = {<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>};</span><br><span class="line"><span class="keyword">int</span> dy[] = {<span class="number">0</span>,<span class="number">-1</span>,<span class="number">1</span>,<span class="number">0</span>};</span><br><span class="line"><span class="keyword">char</span> dir[] = {<span class="string">‘d’</span>,<span class="string">‘l’</span>,<span class="string">‘r’</span>,<span class="string">‘u’</span>};</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">manhattan</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> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">3</span>;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<<span class="number">3</span>;j++){</span><br><span class="line"> <span class="keyword">int</span> w = G[i][j];</span><br><span class="line"> <span class="keyword">if</span>(w==<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> sum += <span class="built_in">abs</span>(goal[w][<span class="number">0</span>] - i) + <span class="built_in">abs</span>(goal[w][<span class="number">1</span>] - j);</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><span class="line"><span class="keyword">char</span> sta[<span class="number">500</span>];</span><br><span class="line"><span class="keyword">bool</span> flag = <span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">idastar</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y,<span class="keyword">int</span> pre,<span class="keyword">int</span> step,<span class="keyword">int</span> top)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(flag)<span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> <span class="keyword">if</span>(flag)<span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">int</span> nx = x + dx[i];</span><br><span class="line"> <span class="keyword">int</span> ny = y + dy[i];</span><br><span class="line"> <span class="keyword">if</span>(nx > <span class="number">2</span>||ny><span class="number">2</span>||nx < <span class="number">0</span>||ny<<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(pre + i == <span class="number">3</span>)<span class="keyword">continue</span>;</span><br><span class="line"> swap(G[x][y],G[nx][ny]);</span><br><span class="line"> <span class="keyword">int</span> mht = manhattan();</span><br><span class="line"> <span class="keyword">if</span>(mht==<span class="number">0</span>){</span><br><span class="line"> sta[step] = dir[i];</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">“%s\n”</span>,sta);</span><br><span class="line"> flag = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(mht + step <= top){</span><br><span class="line"> <span class="keyword">if</span>(flag) <span class="keyword">return</span>;</span><br><span class="line"> sta[step] = dir[i];</span><br><span class="line"> idastar(nx,ny,i,step+<span class="number">1</span>,top);</span><br><span class="line"> }</span><br><span class="line"> swap(G[x][y],G[nx][ny]);</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">bool</span> <span class="title">isok</span><span class="params">(<span class="keyword">int</span> <em>state)</em></span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">9</span>;i++){</span><br><span class="line"> <span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span>(state[i]==<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>;j<<span class="number">9</span>;j++){</span><br><span class="line"> <span class="keyword">if</span>(state[i] > state[j]&&state[j])</span><br><span class="line"> num++;</span><br><span class="line"> }</span><br><span class="line"> sum += num;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sum%<span class="number">2</span>;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">char</span> s[<span class="number">100</span>];</span><br><span class="line"> <span class="keyword">while</span>(~<span class="built_in">scanf</span>(<span class="string">“ %c”</span>,&s[<span class="number">0</span>])){</span><br><span class="line"> <span class="built_in">memset</span>(sta,<span class="number">0</span>,<span class="keyword">sizeof</span>(sta));</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<<span class="number">9</span>;i++){</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">“ %c”</span>,&s[i]);</span><br><span class="line"> }</span><br><span class="line"> flag = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> bx,by;</span><br><span class="line"> <span class="keyword">int</span> state[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">9</span>;i++){</span><br><span class="line"> <span class="keyword">if</span>(s[i]==<span class="string">‘x’</span>){</span><br><span class="line"> G[i/<span class="number">3</span>][i%<span class="number">3</span>] = <span class="number">0</span>;</span><br><span class="line"> state[i] = <span class="number">0</span>;</span><br><span class="line"> bx = i/<span class="number">3</span>;</span><br><span class="line"> by = i%<span class="number">3</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> G[i/<span class="number">3</span>][i%<span class="number">3</span>] = s[i]-<span class="string">‘0’</span>;</span><br><span class="line"> state[i] = s[i] - <span class="string">‘0’</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span>(isok(state)){</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">“unsolvable\n”</span>);</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> ans = manhattan();</span><br><span class="line"> <span class="keyword">if</span>(ans==<span class="number">0</span>){</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">“\n”</span>);</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">int</span> top = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(++top){</span><br><span class="line"> idastar(bx,by,<span class="number">-1</span>,<span class="number">0</span>,top);</span><br><span class="line"> <span class="keyword">if</span>(flag)</span><br><span class="line"> <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"> <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">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=1043" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>poj2676(数独 搜索)</title>
<link href="https://www.djangoz.com/2018/10/09/poj2676/"/>
<id>https://www.djangoz.com/2018/10/09/poj2676/</id>
<published>2018-10-09T14:56:53.000Z</published>
<updated>2018-12-06T03:26:30.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://poj.org/problem?id=2676" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>解出N个9x9的数独,(输出一个解即可)</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>用一个二维布尔数组来标记,点(x,y)的行,列,块的数字是否已经出现过,然后直接暴力搜索即可</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">bool</span> vis[<span class="number">100</span>][<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> G[<span class="number">10</span>][<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> N = <span class="number">10</span>;</span><br><span class="line"><span class="keyword">int</span> M = <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">getid</span><span class="params">(<span class="keyword">int</span>& x,<span class="keyword">int</span>& y)</span> <span class="comment">//得到(x,y)所属的块</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(x<<span class="number">3</span>&&y<<span class="number">3</span>) <span class="keyword">return</span> M+<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">6</span>&&y<<span class="number">3</span>) <span class="keyword">return</span> M+<span class="number">2</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">9</span>&&y<<span class="number">3</span>)<span class="keyword">return</span> M+<span class="number">3</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">3</span>&&y<<span class="number">6</span>)<span class="keyword">return</span> M+<span class="number">4</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">6</span>&&y<<span class="number">6</span>) <span class="keyword">return</span> M+<span class="number">5</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">9</span>&&y<<span class="number">6</span>) <span class="keyword">return</span> M+<span class="number">6</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">3</span>&&y<<span class="number">9</span>)<span class="keyword">return</span> M+<span class="number">7</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(x<<span class="number">6</span>&&y<<span class="number">9</span>) <span class="keyword">return</span> M+<span class="number">8</span>;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">return</span> M+<span class="number">9</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span> ojbk = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(ojbk)<span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">if</span>(y><span class="number">8</span>){</span><br><span class="line"> y %= <span class="number">9</span>;</span><br><span class="line"> x++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(x==<span class="number">9</span>&&y==<span class="number">0</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">9</span>;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<<span class="number">9</span>;j++){</span><br><span class="line"> <span class="built_in">cout</span> << G[i][j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> ojbk = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(G[x][y]){</span><br><span class="line"> dfs(x,y+<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> r = y;</span><br><span class="line"> <span class="keyword">int</span> c = N+x;</span><br><span class="line"> <span class="keyword">int</span> id = getid(x,y);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k=<span class="number">1</span>;k<=<span class="number">9</span>;k++){</span><br><span class="line"> <span class="keyword">if</span>(vis[r][k]||vis[c][k]||vis[id][k]) <span class="keyword">continue</span>;</span><br><span class="line"> G[x][y] = k;</span><br><span class="line"> vis[r][k] = <span class="number">1</span>;</span><br><span class="line"> vis[c][k] = <span class="number">1</span>;</span><br><span class="line"> vis[id][k] = <span class="number">1</span>;</span><br><span class="line"> dfs(x,y+<span class="number">1</span>);</span><br><span class="line"> G[x][y] = <span class="number">0</span>; <span class="comment">//回朔</span></span><br><span class="line"> vis[r][k] = <span class="number">0</span>;</span><br><span class="line"> vis[c][k] = <span class="number">0</span>;</span><br><span class="line"> vis[id][k] = <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><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">string</span> s;</span><br><span class="line"> <span class="keyword">while</span>(<span class="built_in">cin</span> >> s){</span><br><span class="line"> <span class="keyword">if</span>(s==<span class="string">“end”</span>)<span class="keyword">break</span>;</span><br><span class="line"> ojbk = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> <span class="keyword">int</span> k = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">9</span>;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<<span class="number">9</span>;j++){</span><br><span class="line"> <span class="keyword">if</span>(s[k]==<span class="string">‘.’</span>){</span><br><span class="line"> G[i][j] = <span class="number">0</span>;</span><br><span class="line"> k++;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> G[i][j] = s[k++]-<span class="string">‘0’</span>;</span><br><span class="line"> <span class="keyword">if</span>(G[i][j]==<span class="number">0</span>)<span class="keyword">continue</span>;</span><br><span class="line"> vis[j][G[i][j]] = <span class="number">1</span>;</span><br><span class="line"> vis[N+i][G[i][j]] = <span class="number">1</span>;</span><br><span class="line"> vis[getid(i,j)][G[i][j]] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> dfs(<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line"> <span class="built_in">cout</span> << <span class="built_in">endl</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="http://poj.org/problem?id=2676" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="headerlink" title="
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>hdu3533Escape(预处理+bfs)</title>
<link href="https://www.djangoz.com/2018/10/09/hdu3533/"/>
<id>https://www.djangoz.com/2018/10/09/hdu3533/</id>
<published>2018-10-09T12:46:39.000Z</published>
<updated>2018-12-06T03:17:40.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3533" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a><a href="#题意" title="题意"></a>题意</h2><p>A要从(0,0)到(m,n),A有体力值D,每秒都会消耗体力值1,有K座炮塔,每座炮塔都会发射子弹,给出炮塔射击的方向,并且具有一个射击周期,和子弹的速度。</p><ul><li>当且仅当子弹在整数坐标(时间以1秒为最小单位)是才能击中A</li><li>炮塔会挡住子弹</li><li>人可以站着不动</li><li>当终点有炮塔的时候不能到达<br>求A能否到达终点,如果能输出最短时间。</li></ul><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a><a href="#解题思路" title="解题思路"></a>解题思路</h2><p>写这题的时候感觉有点掉头发。。。<br>首先预处理子弹会在哪个位置有效击中,用一个三维数组来保存信息,对于每个子弹,先求出子弹能到达的最远位置,然后在0~d的时间内求,然后再用bfs来搜索可行的路线,当第一次能到达(m,n)就是所求答案。</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a><a href="#AC代码" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><functional></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxm = <span class="number">1005</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">105</span>;</span><br><span class="line"><span class="keyword">int</span> dx[] = {<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>,<span class="number">0</span>};</span><br><span class="line"><span class="keyword">int</span> dy[] = {<span class="number">0</span>,<span class="number">1</span>,<span class="number">-1</span>,<span class="number">0</span>,<span class="number">0</span>};</span><br><span class="line"><span class="keyword">char</span> dir[] = {<span class="string">‘S’</span>,<span class="string">‘E’</span>,<span class="string">‘W’</span>,<span class="string">‘N’</span>};</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</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> step;</span><br><span class="line"> Node(){}</span><br><span class="line"> Node(<span class="keyword">int</span> a,<span class="keyword">int</span> b,<span class="keyword">int</span> c):x(a),y(b),step(c){}</span><br><span class="line">};</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Castle</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">char</span> c;</span><br><span class="line"> <span class="keyword">int</span> t,v;</span><br><span class="line"> <span class="keyword">int</span> x,y;</span><br><span class="line">};</span><br><span class="line">Castle E[maxn];</span><br><span class="line"><span class="keyword">bool</span> mmp[maxm][maxn][maxn];</span><br><span class="line"><span class="keyword">bool</span> B[maxn][maxn],vis[maxm][maxn][maxn];</span><br><span class="line"><span class="keyword">int</span> m,n,k,d;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> it=<span class="number">0</span>;it<k;it++){</span><br><span class="line"> <span class="keyword">int</span> di;</span><br><span class="line"> <span class="keyword">int</span> X,Y;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++) </span><br><span class="line"> <span class="keyword">if</span>(dir[i]==E[it].c)</span><br><span class="line"> di = i;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<maxm;i++){</span><br><span class="line"> <span class="keyword">int</span> nx = E[it].x + dx[di]<em>i;</em></span><br><span class="line"> <span class="keyword">int</span> ny = E[it].y + dy[di]i;</span><br><span class="line"> <span class="keyword">if</span>(nx < <span class="number">0</span> || nx > m || ny <<span class="number">0</span> || ny > n || B[nx][ny]){</span><br><span class="line"> X = nx,Y = ny; <span class="comment">//子弹最远能到达的坐标</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(E[it].c==<span class="string">‘S’</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<=d;j+=E[it].t){ <span class="comment">//从0到d,子弹能打中的位置</span></span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> l = E[it].x+E[it].v;l<X;l+= E[it].v){</span><br><span class="line"> t++;</span><br><span class="line"> <span class="keyword">if</span>(j+t < d)</span><br><span class="line"> mmp[j+t][l][E[it].y] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(E[it].c==<span class="string">‘N’</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<=d;j+=E[it].t){</span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> l=E[it].x-E[it].v;l>X;l-=E[it].v){</span><br><span class="line"> t++;</span><br><span class="line"> <span class="keyword">if</span>(j+t<d)</span><br><span class="line"> mmp[j+t][l][E[it].y] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(E[it].c==<span class="string">‘E’</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<=d;j+=E[it].t){</span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> r = E[it].y+E[it].v;r < Y;r += E[it].v){</span><br><span class="line"> t++;</span><br><span class="line"> <span class="keyword">if</span>(t+j<=d)</span><br><span class="line"> mmp[j+t][E[it].x][r] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<=d;j+=E[it].t){</span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> r = E[it].y-E[it].v;r>Y;r-=E[it].v){</span><br><span class="line"> t++;</span><br><span class="line"> <span class="keyword">if</span>(j+t<d){</span><br><span class="line"> mmp[j+t][E[it].x][r] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</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">bfs</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">queue</span><Node> Q;</span><br><span class="line"> <span class="function">Node <span class="title">b</span><span class="params">(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>)</span></span>;</span><br><span class="line"> Q.push(b);</span><br><span class="line"> vis[<span class="number">0</span>][<span class="number">0</span>][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> Node t = Q.front();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">if</span>(t.step>=d)<span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">if</span>(t.x==m&&t.y==n){</span><br><span class="line"> <span class="built_in">cout</span> << t.step << <span class="built_in">endl</span>;</span><br><span class="line"> <span class="keyword">return</span> ;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">5</span>;i++){</span><br><span class="line"> <span class="keyword">int</span> nx = t.x + dx[i];</span><br><span class="line"> <span class="keyword">int</span> ny = t.y + dy[i];</span><br><span class="line"> <span class="keyword">int</span> step = t.step+<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span>(nx <<span class="number">0</span>||nx >m||ny<<span class="number">0</span>||ny>n||vis[step][nx][ny])<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(B[nx][ny])<span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">if</span>(mmp[step][nx][ny])<span class="keyword">continue</span>;</span><br><span class="line"> vis[step][nx][ny] = <span class="number">1</span>;</span><br><span class="line"> Q.push(Node(nx,ny,step));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“Bad luck!”</span><< <span class="built_in">endl</span>;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ios::sync_with_stdio(<span class="literal">false</span>);</span><br><span class="line"> <span class="built_in">cin</span>.tie(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">while</span>(<span class="built_in">cin</span> >> m >> n >> k >> d){</span><br><span class="line"> <span class="built_in">memset</span>(B,<span class="number">0</span>,<span class="keyword">sizeof</span>(B));</span><br><span class="line"> <span class="built_in">memset</span>(mmp,<span class="number">0</span>,<span class="keyword">sizeof</span>(mmp));</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<k;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> E[i].c >> E[i].t >> E[i].v >> E[i].x >> E[i].y;</span><br><span class="line"> B[E[i].x][E[i].y] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> init();</span><br><span class="line"> <span class="keyword">if</span>(B[m][n]){ <span class="comment">//当终点有炮塔的时候不能到达</span></span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">“Bad luck!”</span><< <span class="built_in">endl</span>;</span><br><span class="line"> }<span class="keyword">else</span></span><br><span class="line"> bfs();</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3533" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
<category term="搜索" scheme="https://www.djangoz.com/tags/%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>hdu3416Marriage Match IV (网络流+最短路)</title>
<link href="https://www.djangoz.com/2018/10/04/hdu3416/"/>
<id>https://www.djangoz.com/2018/10/04/hdu3416/</id>
<published>2018-10-04T03:34:30.000Z</published>
<updated>2018-10-04T03:46:42.000Z</updated>
<content type="html"><![CDATA[<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3416" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>N个城市M条路径,给定起点A,终点B,求有几条从A到B的最短路(其中每经过的路径不能重复)</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>先用最短路求出A到B的最短路Min,也求出A到每个城市的距离dis[N],然后反向求B到A的最短路,得到B到每个城市的最短距离dis2[N],然后遍历每条路径edge,如果dis[edge.from] + edge.len + dis2[edge.to]== Min,就说明这条路径一定是A到B的最短路中会经过的路径,,每条路径的容量为1,把每条符合条件的路径加入到最大流的图中,建完图后,以A为源点,B为汇点跑最大流即可(用EdmondsKarp会超时,跑Dinic即可)</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><bits/stdc++.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e5</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> INF = <span class="number">0x3f3f3f3f</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> from,to,cap,flow;</span><br><span class="line"> Edge(){}</span><br><span class="line"> Edge(<span class="keyword">int</span> u,<span class="keyword">int</span> v,<span class="keyword">int</span> c,<span class="keyword">int</span> f):from(u),to(v),cap(c),flow(f){}</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Dinic</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> n,m,s,t;</span><br><span class="line"> <span class="built_in">vector</span><Edge> edges;</span><br><span class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> G[maxn];</span><br><span class="line"> <span class="keyword">bool</span> vis[maxn];</span><br><span class="line"> <span class="keyword">int</span> d[maxn];</span><br><span class="line"> <span class="keyword">int</span> cur[maxn];</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">(<span class="keyword">int</span> n)</span></span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++) G[i].clear();</span><br><span class="line"> edges.clear();</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">AddEdge</span><span class="params">(<span class="keyword">int</span> from,<span class="keyword">int</span> to,<span class="keyword">int</span> cap)</span></span>{</span><br><span class="line"> edges.push_back(Edge(from,to,cap,<span class="number">0</span>));</span><br><span class="line"> edges.push_back(Edge(to,from,<span class="number">0</span>,<span class="number">0</span>));</span><br><span class="line"> m = edges.size();</span><br><span class="line"> G[from].push_back(m<span class="number">-2</span>);</span><br><span class="line"> G[to].push_back(m<span class="number">-1</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">BFS</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> <span class="built_in">queue</span><<span class="keyword">int</span>> Q;</span><br><span class="line"> Q.push(s);</span><br><span class="line"> d[s] = <span class="number">0</span>;</span><br><span class="line"> vis[s] = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> <span class="keyword">int</span> x = Q.front();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<G[x].size();i++){</span><br><span class="line"> Edge& e = edges[G[x][i]];</span><br><span class="line"> <span class="keyword">if</span>(!vis[e.to]&&e.cap > e.flow){</span><br><span class="line"> vis[e.to] = <span class="number">1</span>;</span><br><span class="line"> d[e.to] = d[x]+<span class="number">1</span>;</span><br><span class="line"> Q.push(e.to);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> vis[t];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">DFS</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> a)</span></span>{</span><br><span class="line"> <span class="keyword">if</span>(x==t || a==<span class="number">0</span>)<span class="keyword">return</span> a;</span><br><span class="line"> <span class="keyword">int</span> flow = <span class="number">0</span>,f;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> &i=cur[x];i<G[x].size();i++){</span><br><span class="line"> Edge& e = edges[G[x][i]];</span><br><span class="line"> <span class="keyword">if</span>(d[x]+<span class="number">1</span>==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))><span class="number">0</span>){</span><br><span class="line"> e.flow += f;</span><br><span class="line"> edges[G[x][i]^<span class="number">1</span>].flow -= f;</span><br><span class="line"> flow += f;</span><br><span class="line"> a -= f;</span><br><span class="line"> <span class="keyword">if</span>(a==<span class="number">0</span>)<span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> flow;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">Maxflow</span><span class="params">(<span class="keyword">int</span> s,<span class="keyword">int</span> t)</span></span>{</span><br><span class="line"> <span class="keyword">this</span>->s = s,<span class="keyword">this</span>->t = t;</span><br><span class="line"> <span class="keyword">int</span> flow = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(BFS()){</span><br><span class="line"> <span class="built_in">memset</span>(cur,<span class="number">0</span>,<span class="keyword">sizeof</span>(cur));</span><br><span class="line"> flow += DFS(s,INF);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> flow;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="built_in">vector</span><Edge> G1[maxn];</span><br><span class="line"><span class="built_in">vector</span><Edge> G2[maxn];</span><br><span class="line"><span class="keyword">int</span> N,M;</span><br><span class="line"><span class="keyword">int</span> dis[maxn],dis2[maxn];</span><br><span class="line"><span class="keyword">bool</span> vis[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dijkstra</span><span class="params">(<span class="keyword">int</span> A,<span class="built_in">vector</span><Edge> G[maxn],<span class="keyword">int</span> dis[maxn])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> priority_queue<pii,<span class="built_in">vector</span><pii>,greater<pii> > Q;</span><br><span class="line"> dis[A] = <span class="number">0</span>;</span><br><span class="line"> Q.push(pii(dis[A],A));</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> pii t = Q.top();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">int</span> d = t.first;</span><br><span class="line"> <span class="keyword">int</span> u = t.second;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<G[u].size();i++){</span><br><span class="line"> Edge e = G[u][i];</span><br><span class="line"> <span class="keyword">if</span>(e.cap + d < dis[e.to]){</span><br><span class="line"> dis[e.to] = e.cap + d;</span><br><span class="line"> Q.push(pii(dis[e.to],e.to));</span><br><span class="line"> }</span><br><span class="line"> }</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">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> ios::sync_with_stdio(<span class="literal">false</span>);</span><br><span class="line"> <span class="built_in">cin</span>.tie(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> Dinic ek;</span><br><span class="line"> <span class="keyword">while</span>(T--){</span><br><span class="line"> <span class="built_in">cin</span> >> N >> M;</span><br><span class="line"> ek.init(N);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<=N;i++){</span><br><span class="line"> G1[i].clear();</span><br><span class="line"> G2[i].clear();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> a,b,c;</span><br><span class="line"> Edge e;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<M;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> a >> b >> c;</span><br><span class="line"> e.from = a;</span><br><span class="line"> e.to = b;</span><br><span class="line"> e.cap = c;</span><br><span class="line"> G1[e.from].push_back(e);</span><br><span class="line"> swap(e.to,e.from);</span><br><span class="line"> G2[e.from].push_back(e);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> A,B;</span><br><span class="line"> <span class="built_in">cin</span> >> A >> B;</span><br><span class="line"> <span class="built_in">memset</span>(dis,<span class="number">0x3f</span>,<span class="keyword">sizeof</span>(dis));</span><br><span class="line"> dijkstra(A,G1,dis); <span class="comment">//正向跑最短路</span></span><br><span class="line"> <span class="built_in">memset</span>(dis2,<span class="number">0x3f</span>,<span class="keyword">sizeof</span>(dis2));</span><br><span class="line"> <span class="keyword">int</span> Min = dis[B]; </span><br><span class="line"> dijkstra(B,G2,dis2); <span class="comment">//反向跑最短路</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<G1[i].size();j++){</span><br><span class="line"> e = G1[i][j];</span><br><span class="line"> <span class="keyword">if</span>(dis[e.from] + e.cap + dis2[e.to]==Min){</span><br><span class="line"> ek.AddEdge(e.from,e.to,<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cout</span> << ek.Maxflow(A,B) << <span class="built_in">endl</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3416" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="hea
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="图论" scheme="https://www.djangoz.com/tags/%E5%9B%BE%E8%AE%BA/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
</entry>
<entry>
<title>LightOJ1074Extended Traffic(bellman_ford最短路+负环标记)</title>
<link href="https://www.djangoz.com/2018/10/03/LightOJ1074/"/>
<id>https://www.djangoz.com/2018/10/03/LightOJ1074/</id>
<published>2018-10-03T03:19:42.000Z</published>
<updated>2018-10-03T03:33:36.000Z</updated>
<content type="html"><![CDATA[<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>T组样例,N个地点,每个地点有个繁忙度,地点间有M条街道,每条街道要收过路费(目的地繁忙度-起点繁忙度)^3 (3次方),有Q个查询,包含Q个目的地,求从起点1到每个目的地的最小花费。如果花费小于3或者无法到达目的地,则输出”?”</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>由于目的地繁忙度不一定大于起点繁忙度,所以图中有负环(一开始没想到,直接用dijkstra一直WA),所以要用bellman_ford来求最短路,当某些地点位于负环内,就肯定最终花费小于3。</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a>AC代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><bits/stdc++.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e3</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxm = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> inf = <span class="number">0x2f3f3f3f</span>; <span class="comment">//这里给值小于初始dis数组赋值,原因可能是在跑bellman_ford的时候,负环和目的地的值相加变小了,直接判断目的地的值等于初始值的话,会wa</span></span><br><span class="line"><span class="keyword">int</span> N,M;</span><br><span class="line"><span class="keyword">int</span> A[maxn];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> from,to,cost;</span><br><span class="line">};</span><br><span class="line"><span class="keyword">int</span> dis[maxn];</span><br><span class="line"><span class="keyword">bool</span> vis[maxn];</span><br><span class="line">Edge G[maxm];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bellman_ford</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">memset</span>(dis,<span class="number">0x3f</span>,<span class="keyword">sizeof</span>(dis));</span><br><span class="line"> dis[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<M;j++){</span><br><span class="line"> Edge e = G[j];</span><br><span class="line"> <span class="keyword">if</span>(dis[e.from] + e.cost < dis[e.to]){</span><br><span class="line"> dis[e.to] = e.cost + dis[e.from];</span><br><span class="line"> <span class="keyword">if</span>(i==N){</span><br><span class="line"> vis[e.from] = <span class="number">1</span>; <span class="comment">//</span></span><br><span class="line"> vis[e.to] = <span class="number">1</span>; <span class="comment">//标记负环内结点</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</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">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> <span class="keyword">int</span> Case = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span>(T--){</span><br><span class="line"> <span class="built_in">cin</span> >> N;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> A[i];</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cin</span> >> M;</span><br><span class="line"> <span class="keyword">int</span> a,b;</span><br><span class="line"> Edge e;</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<M;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> a >> b;</span><br><span class="line"> e.from = a;</span><br><span class="line"> e.to = b;</span><br><span class="line"> e.cost = <span class="built_in">pow</span>(A[b]-A[a],<span class="number">3</span>);</span><br><span class="line"> G[i] = e;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> Q = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> Q;</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">"Case "</span> << Case++ << <span class="string">":"</span> << <span class="built_in">endl</span>;</span><br><span class="line"> bellman_ford();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<Q;i++){</span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> t;</span><br><span class="line"> <span class="keyword">if</span>(dis[t] < <span class="number">3</span> || dis[t]>=inf || vis[t]){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">"?"</span> << <span class="built_in">endl</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="built_in">cout</span> << dis[t] << <span class="built_in">endl</span>;</span><br><span class="line"> }</span><br><span class="line"> }</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>T组样例,N个地点,每个地点有个繁忙度,地点间有M条街道,每条街道要收过路费(目的地繁忙度-起点繁忙度)^3 (3次方),有Q个查询,包含Q
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="图论" scheme="https://www.djangoz.com/tags/%E5%9B%BE%E8%AE%BA/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
</entry>
<entry>
<title>搞ACM的你伤不起(转载)</title>
<link href="https://www.djangoz.com/2018/10/02/acm/"/>
<id>https://www.djangoz.com/2018/10/02/acm/</id>
<published>2018-10-02T10:42:55.000Z</published>
<updated>2018-10-02T10:44:28.000Z</updated>
<content type="html"><![CDATA[<p>看到这个感觉太真实了,笑死我了!!!</p><p>RoBa原创,转载请注明出处</p><p>劳资六年前开始搞ACM啊!!!!!!!!!!<br>从此踏上了尼玛不归路啊!!!!!!!!!!!!<br>谁特么跟劳资讲算法是程序设计的核心啊!!!!!!<br>尼玛除了面试题就没见过用算法的地方啊!!!!!!<br>谁再跟劳资讲算法之美算法的力量,劳资一本算法导论拍死你啊!!!!!!!!<br>那是搞ACM的入门书啊!!!!特么的入门书就一千多页啊!!!!!!!<br>还没有习题答案啊,学完了你特么都不知道自己到底会不会啊有木有!!!!!!<br>然后你就得看lrj的黑书啊!!!!!!还是特么的没有习题答案啊!!!!<br>那书难的一B啊!!!!人家一个“显然”得出的结论够你想一礼拜啊有木有!!!!<br>一个课后题够你想几个月啊有木有!!!!<br>然后还有一堆堆的书啊!!!!每一类算法都足够写一本书啊!!!!<br>每本都是砖头一样啊!!!!还都特么是英文的啊!!!!<br>也有中文翻译版啊!!!!!!翻译得跟屎一样啊!!!!<br>你看的时候得把它再变回英文才能懂啊!!!!!!有木有!!!!!!</p><p>ACM的题目类型是没有范围的啊!!!!!!<br>动态规划有木有!!!!数据结构有木有!!!!<br>图论有木有!!!!!!计算几何有木有!!!!!!<br>数论有木有!!!!!!要写两三百行的模拟题有木有!!!!!!<br>特么连物理题化学题都有啊!!!!!!<br>还有理论上就不可做的NP难问题啊!!!!!!<br>特么理论上不可做的题也有人能AC啊!!!!坑爹啊!!!!</p><p>课本上学的东西完全不给力啊!!!!!!<br>你以为学过一个最长公共子串就是懂动态规划了啊!!!!!!<br>树型的有木有!!!!状态压缩的有木有!!!!插头的有木有!!!!<br>而且特么写出来就超时啊!!!!!!<br>你得四边形优化啊!!!!你得斜率优化啊!!!!你得队列优化啊!!!!<br>特么恨不得把要算十年的程序优化到一秒啊!!!!<br>你以为学过一个二叉搜索树就是懂数据结构了啊!!!!!!<br>平衡啊旋转啊红啊黑啊有木有!!!!<br>伸展啊随机权重啊合并啊拆分啊有木有!!!!!!<br>你以为学过一个Dijkstra最短路就是懂图算法了啊!!!!!!<br>特么的图里有几百万个点啊!!!!!!得用堆来优化啊!!!!<br>而且边权要是负的就不对了啊!!!!还有环啊!!!!<br>而且特么的你根本看不出是最短路问题啊!!!!!!<br>为神马最短路算法可以用来解不等式啊!!!!<br>还有网络流啊!!!!特么的课本上的算法铁定超时啊!!!!!!<br>你得看论文去研究神马Dinic啊SAP啊!!!!!!<br>而且你还是根本看不出是网络流啊!!!!!!<br>网络流是在图上来求啊!!!!特么的图在哪里啊!!!!<br>特么的八竿子打不着的问题都能变成网络流啊!!!!!!</p><p>这些你都学会了啊!!!!想参加比赛了啊!!!!发现想拿个成绩非常难啊!!!!!!<br>校内选拔赛就好几百人报名啊有木有!!!!!!最后只能剩下十几个啊!!!!<br>人家都是竞赛保送的啊!!!!!!中学就学了好几年了有木有!!!!怎么比的过啊!!!!!!<br>进了校队以后你就不要想寒暑假了啊!!!!!!<br>夏天劳资全身脱光了涂满花露水半夜刷题有木有!!!!!!<br>冬天劳资跑遍校园找不到一个开门的食堂有木有!!!!!!<br>而且特么老外的在线比赛都在半夜啊!!!!!!!!在机房通宵是常事啊有木有!!!!!!</p><p>比赛是三个人啊!!!!但是只有一台电脑啊!!!!!!<br>特么的ACM组委会连多买几台电脑都不肯啊!!!!!!<br>队友占着机器你就只能干着急啊!!!!!!想把他踹一边儿去啊!!!!!!<br>没机器你就得在纸上调试啊!!!!!!你的脑子就是个CPU啊有木有!!!!<br>你要是摊上一个啥都不会,连读题都误导你的队友,你就死定了啊!!!!!!<br>不怕神一样的对手就怕猪一样的队友啊!!!!</p><p>你终于参加区域赛了啊!!!!一百多个队啊!!!!!!<br>还有一大堆打星号的高中生们啊!!!!!!都是全国前几名级别的有木有!!!!<br>还有一大堆打星号的老不死们啊!!!!!!毕业了还要来诈尸啊!!!!<br>一开场那气球呼呼地挂啊!!!!你还没读完题人家已经AC了啊!!!!<br>而且最先过的不一定是最简单的啊!!!!人家故意在误导你啊有木有!!!!!!<br>比赛要五个小时啊!!!!结束了以后脑子都抽筋了啊!!!!<br>人家做七八道题,你连一半都不到啊!!!!!!<br>拿个毛的奖啊!!!!去个毛的总决赛啊!!!!!!<br>去了总决赛也是被虐啊!!!!!!老毛子们更尼玛不是人啊有木有!!!!!!<br>连清华都被虐啊有木有!!!!!!</p><p>你拿着一堆Honorable Mention毕业了啊!!!!想找工作啊!!!!<br>谁说懂算法很容易找到好工作啊!!!!<br>都特么要项目经验有木有!!!!<br>劳资成天盯着一个黑乎乎的控制台窗口!!!!哪有时间做项目啊!!!!!!<br>同学们都是网站啊桌面程序啊做过一堆啊!!!!<br>人家对面试官侃侃而谈啊!!!<br>劳资只好说劳资除了算法啥也不会啊!!<br>而且其实算法也没学会啊!!!!!坑爹啊!!!!</p><p>终于工作了啊!!!!发现算法神马的完全用不上啊!!!!<br>稍微复杂点的算法都有现成的库可以用啊!!!!!!<br>要懂Shell编程有木有!!!!<br>要懂多线程有木有!!!!<br>要懂Socket有木有!!!!<br>要懂分布式有木有!!!!<br>要懂J2EE有木有!!!!要懂设计模式有木有!!!!</p><p>要懂以下省略三千字有木有!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p><p>总之搞ACM的上辈子都是脑细胞死光钻到牛角尖里出不来的天使啊!!!!!!你伤不起啊!!!!!!</p>]]></content>
<summary type="html">
<p>看到这个感觉太真实了,笑死我了!!!</p>
<p>RoBa原创,转载请注明出处</p>
<p>劳资六年前开始搞ACM啊!!!!!!!!!!<br>从此踏上了尼玛不归路啊!!!!!!!!!!!!<br>谁特么跟劳资讲算法是程序设计的核心啊!!!!!!<br>尼玛除了面试题就
</summary>
<category term="闲言碎语" scheme="https://www.djangoz.com/tags/%E9%97%B2%E8%A8%80%E7%A2%8E%E8%AF%AD/"/>
</entry>
<entry>
<title>poj1062昂贵的聘礼(枚举+最短路)</title>
<link href="https://www.djangoz.com/2018/10/02/poj1062/"/>
<id>https://www.djangoz.com/2018/10/02/poj1062/</id>
<published>2018-10-02T03:34:19.000Z</published>
<updated>2018-10-02T03:49:20.000Z</updated>
<content type="html"><![CDATA[<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>额,直接看题目吧,反正也是中文题,不好用几句话表述清楚~~~<br><a href="http://poj.org/problem?id=1062" target="_blank" rel="noopener">题目链接</a></p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>因为等级差距不能间接交易,所以每个交易的等级都在一个区间内,这个区间必须包含大祭司的等级,可以把区间枚举,设大祭司等级为L,则需要从[L-M,L],一直枚举到[L,L+M],保证所有交易的点的等级都在这个区间内就可以了,然后在进行最短路处理,进行最短路的过程中,先不考虑直接购买物品的价值,直接全部走兑换的形式,然后把得到的数组加上直接购买物品的价值,从中找到最小值就是答案。</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a>AC代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e4</span>+<span class="number">5</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> val,level;</span><br><span class="line"> <span class="keyword">int</span> X;</span><br><span class="line"> <span class="built_in">vector</span><pii> vp; </span><br><span class="line">};</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> from,to,val;</span><br><span class="line">};</span><br><span class="line">Node L[maxn];</span><br><span class="line"><span class="built_in">vector</span><Edge> G[maxn];</span><br><span class="line"><span class="keyword">int</span> dis[maxn];</span><br><span class="line"><span class="keyword">bool</span> vis[maxn];</span><br><span class="line"><span class="keyword">int</span> N,M;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">dijkstra</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">memset</span>(dis,<span class="number">0x3f</span>,<span class="keyword">sizeof</span>(dis));</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> priority_queue<pii,<span class="built_in">vector</span><pii>,greater<pii> > Q;</span><br><span class="line"> dis[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> Q.push(pii(dis[<span class="number">1</span>],<span class="number">1</span>));</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> pii t = Q.top();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">int</span> d = t.first;</span><br><span class="line"> <span class="keyword">int</span> u = t.second;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<G[u].size();i++){</span><br><span class="line"> Edge e = G[u][i];</span><br><span class="line"> <span class="keyword">if</span>(e.val + d < dis[e.to]){</span><br><span class="line"> dis[e.to] = e.val + d;</span><br><span class="line"> Q.push(pii(dis[e.to],e.to));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> ans = <span class="number">1</span><<<span class="number">30</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> dis[i] += L[i].val;</span><br><span class="line"> ans = min(ans,dis[i]);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ans;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">cin</span> >> M >> N;</span><br><span class="line"> <span class="keyword">int</span> a,b;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> L[i].val >> L[i].level >> L[i].X;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<L[i].X;j++){</span><br><span class="line"> <span class="built_in">cin</span> >> a >> b;</span><br><span class="line"> L[i].vp.push_back(pii(a,b));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> Edge e;</span><br><span class="line"> <span class="keyword">int</span> left = max(<span class="number">0</span>,L[<span class="number">1</span>].level-M), right = left + M;</span><br><span class="line"> <span class="keyword">int</span> ans = <span class="number">1</span><<<span class="number">30</span>;</span><br><span class="line"> <span class="keyword">while</span>(left <= L[<span class="number">1</span>].level){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<=N;i++){</span><br><span class="line"> G[i].clear();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=N;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<L[i].X;j++){</span><br><span class="line"> <span class="keyword">int</span> next = L[i].vp[j].first;</span><br><span class="line"> <span class="keyword">if</span> (L[next].level >= left && L[next].level <= right)</span><br><span class="line"> {</span><br><span class="line"> e.from = i;</span><br><span class="line"> e.to = next;</span><br><span class="line"> e.val = L[i].vp[j].second;</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> left++,right++;</span><br><span class="line"> <span class="keyword">int</span> te = dijkstra();</span><br><span class="line"> ans = min(ans,te);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">cout</span> << ans << <span class="built_in">endl</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>额,直接看题目吧,反正也是中文题,不好用几句话表述清楚~~~<br><a href="http://poj.org/problem?id=1
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="图论" scheme="https://www.djangoz.com/tags/%E5%9B%BE%E8%AE%BA/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
</entry>
<entry>
<title>poj1679The Unique MST(次小生成树)</title>
<link href="https://www.djangoz.com/2018/10/01/poj1679/"/>
<id>https://www.djangoz.com/2018/10/01/poj1679/</id>
<published>2018-10-01T10:37:37.000Z</published>
<updated>2018-10-01T10:40:04.000Z</updated>
<content type="html"><![CDATA[<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>n个点m条边,判断最小生成树是否唯一</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>求出次小生成树和最小生成树大小是否相同即可</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstdio></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><set></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cstring></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><cmath></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>,pii> PII;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> B[maxn];</span><br><span class="line"><span class="keyword">int</span> N,M;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> from,to,val;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span><(<span class="keyword">const</span> Edge& e)<span class="keyword">const</span> </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> val < e.val;</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line">Edge E[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Find</span><span class="params">(<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">return</span> B[n]==n?n:B[n]=Find(B[n]);</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">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<=N;i++) B[i] = i;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">int</span> vis[maxn];</span><br><span class="line"><span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">MST</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> sort(E,E+M);</span><br><span class="line"> <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<M;i++){</span><br><span class="line"> <span class="keyword">int</span> t1 = Find(E[i].from);</span><br><span class="line"> <span class="keyword">int</span> t2 = Find(E[i].to);</span><br><span class="line"> <span class="keyword">if</span>(t1!=t2){</span><br><span class="line"> <span class="keyword">if</span>(t1>t2)swap(t1,t2);</span><br><span class="line"> B[t2] = t1;</span><br><span class="line"> vis[cnt++] = i;</span><br><span class="line"> ans += E[i].val;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(cnt==N<span class="number">-1</span>){</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SMT</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> res = <span class="number">1</span><<<span class="number">30</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<cnt;i++){</span><br><span class="line"> init();</span><br><span class="line"> <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">bool</span> ok = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<M;j++){</span><br><span class="line"> <span class="keyword">if</span>(j!=vis[i]){</span><br><span class="line"> <span class="keyword">int</span> t1 = Find(E[j].from);</span><br><span class="line"> <span class="keyword">int</span> t2 = Find(E[j].to);</span><br><span class="line"> <span class="keyword">if</span>(t1!=t2){</span><br><span class="line"> t++;</span><br><span class="line"> ans += E[j].val;</span><br><span class="line"> <span class="keyword">if</span>(t1>t2)swap(t1,t2);</span><br><span class="line"> B[t2] = t1;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(t==N<span class="number">-1</span>){</span><br><span class="line"> ok = <span class="number">1</span>;</span><br><span class="line"> <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"> <span class="keyword">if</span>(ok) res = min(res,ans);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(res==<span class="number">1</span><<<span class="number">30</span>)<span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> T = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> T;</span><br><span class="line"> <span class="keyword">while</span>(T--){</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> cnt = <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">cin</span> >> N >> M;</span><br><span class="line"> init();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<M;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> E[i].from >> E[i].to >> E[i].val;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> t1 = MST();</span><br><span class="line"> <span class="keyword">int</span> t2 = SMT();</span><br><span class="line"> <span class="keyword">if</span>(t1==t2){</span><br><span class="line"> <span class="built_in">cout</span> << <span class="string">"Not Unique!"</span> << <span class="built_in">endl</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="built_in">cout</span> << t1 << <span class="built_in">endl</span>;</span><br><span class="line"> }</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></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>n个点m条边,判断最小生成树是否唯一</p>
<h2 id="解题思路"><a href="#解题思路" class="headerlink
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="图论" scheme="https://www.djangoz.com/tags/%E5%9B%BE%E8%AE%BA/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
</entry>
<entry>
<title>牛客国庆集训派对Day1-New Game!(几何+最短路)</title>
<link href="https://www.djangoz.com/2018/10/01/nowcoderDay1L/"/>
<id>https://www.djangoz.com/2018/10/01/nowcoderDay1L/</id>
<published>2018-10-01T08:03:59.000Z</published>
<updated>2018-10-01T10:26:12.000Z</updated>
<content type="html"><![CDATA[<p><a href="https://www.nowcoder.com/acm/contest/201/L" target="_blank" rel="noopener">题目链接</a></p><h2 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h2><p>给互相平行的直线L1,L2,和N个圆,角色在直线上、圆上、园内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。求最少需要多少体力。</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>这题和poj2502那题很相似,关键在建图,这里考察了圆到圆的最短距离和线到圆的最短距离,一开始写的代码以为圆内要消耗体力,然后计算了一下内含情况的最短距离,结果也AC了,后来发现不需要,可能是题目数据没这种情况吧。</p><h3 id="AC代码"><a href="#AC代码" class="headerlink" title="AC代码"></a>AC代码</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><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><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><bits/stdc++.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">double</span>,<span class="keyword">int</span>> pii;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">1e6</span>+<span class="number">5</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> inf = <span class="number">1e30</span>;</span><br><span class="line"><span class="keyword">int</span> n,A,B,C1,C2;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> </span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> from,to;</span><br><span class="line"> <span class="keyword">double</span> val;</span><br><span class="line">};</span><br><span class="line"><span class="built_in">vector</span><Edge> G[maxn];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</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">double</span> r;</span><br><span class="line">};</span><br><span class="line">Node C[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">getval</span><span class="params">(Node a,Node b)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span>(a.r < b.r){</span><br><span class="line"> swap(a,b);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">double</span> len = <span class="built_in">sqrt</span>((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));</span><br><span class="line"> <span class="comment">// if(len + b.r < a.r){ //内含情况的判断</span></span><br><span class="line"> <span class="comment">// return a.r - (b.r + len);</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="keyword">if</span>(len > a.r + b.r){</span><br><span class="line"> <span class="keyword">return</span> len - a.r - b.r;</span><br><span class="line"> }<span class="keyword">else</span>{</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="keyword">double</span> dis[maxn];</span><br><span class="line"><span class="keyword">bool</span> vis[maxn];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dijkstra</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">memset</span>(vis,<span class="number">0</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"> fill(dis,dis+maxn,inf);</span><br><span class="line"> dis[n] = <span class="number">0</span>;</span><br><span class="line"> priority_queue<pii,<span class="built_in">vector</span><pii>,greater<pii> > Q;</span><br><span class="line"> Q.push(pii(<span class="number">0</span>,n));</span><br><span class="line"> <span class="keyword">while</span>(!Q.empty()){</span><br><span class="line"> pii t = Q.top();</span><br><span class="line"> Q.pop();</span><br><span class="line"> <span class="keyword">double</span> d = t.first;</span><br><span class="line"> <span class="keyword">int</span> u = t.second;</span><br><span class="line"> <span class="keyword">if</span>(vis[u])<span class="keyword">continue</span>;</span><br><span class="line"> vis[u] = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<G[u].size();i++){</span><br><span class="line"> Edge e = G[u][i];</span><br><span class="line"> <span class="keyword">if</span>(e.val + d < dis[e.to]){</span><br><span class="line"> dis[e.to] = e.val + d;</span><br><span class="line"> Q.push(pii(dis[e.to],e.to));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">cout</span> << dis[n+<span class="number">1</span>]<< <span class="built_in">endl</span>;</span><br><span class="line">}</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">int</span> argc, <span class="keyword">char</span> <span class="keyword">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="built_in">cin</span> >> n >> A >> B >> C1 >> C2;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="built_in">cin</span> >> C[i].x >> C[i].y >> C[i].r;</span><br><span class="line"> }</span><br><span class="line"> Edge e;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j<n;j++){</span><br><span class="line"> <span class="keyword">if</span>(i==j)<span class="keyword">continue</span>;</span><br><span class="line"> e.from = i;</span><br><span class="line"> e.to = j;</span><br><span class="line"> e.val = getval(C[i],C[j]);</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> swap(e.from,e.to);</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">double</span> di = <span class="built_in">sqrt</span>(A*A+B*B);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="keyword">double</span> t = <span class="built_in">abs</span>(A*C[i].x + B*C[i].y + C1)/di - C[i].r;</span><br><span class="line"> <span class="keyword">if</span>(t < <span class="number">0</span>) t = <span class="number">0</span>;</span><br><span class="line"> e.from = n;</span><br><span class="line"> e.to = i;</span><br><span class="line"> e.val = t;</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> swap(e.from, e.to);</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<n;i++){</span><br><span class="line"> <span class="keyword">double</span> t = <span class="number">1.0</span>*<span class="built_in">abs</span>(A*C[i].x + B*C[i].y + C2)/di - C[i].r;</span><br><span class="line"> <span class="keyword">if</span>(t < <span class="number">0</span>) t = <span class="number">0</span>;</span><br><span class="line"> e.from = n+<span class="number">1</span>;</span><br><span class="line"> e.to = i;</span><br><span class="line"> e.val = t;</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> swap(e.from, e.to);</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">double</span> t = <span class="number">1.0</span>*<span class="built_in">abs</span>(C1-C2)/di;</span><br><span class="line"> e.from = n;</span><br><span class="line"> e.to = n+<span class="number">1</span>;</span><br><span class="line"> e.val = t;</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"> swap(e.from, e.to);</span><br><span class="line"> G[e.from].push_back(e);</span><br><span class="line"></span><br><span class="line"> dijkstra();</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">
<p><a href="https://www.nowcoder.com/acm/contest/201/L" target="_blank" rel="noopener">题目链接</a></p>
<h2 id="题意"><a href="#题意" class="headerl
</summary>
<category term="c++" scheme="https://www.djangoz.com/categories/c/"/>
<category term="ACM" scheme="https://www.djangoz.com/tags/ACM/"/>
<category term="图论" scheme="https://www.djangoz.com/tags/%E5%9B%BE%E8%AE%BA/"/>
<category term="题解" scheme="https://www.djangoz.com/tags/%E9%A2%98%E8%A7%A3/"/>
</entry>
</feed>