青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

PKU 1198 Solitaire

問題:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1198

思路:
寬度優先搜索
tips:
1. 如何表示整個chessboard?
   最簡單的方法是用二維數組,不過如果發現該chessboard是8X8的話,很自然地會想到是否可以用一個整數來表示
   答案是肯定的,long long類型,不過可能unsigned long long會更合適,避免負數產生的影響呵呵

2. 如何判斷一個狀態是否被訪問過?
   根據tips 1,我們使用一個unsigned long long來表示狀態,而如果用一個一維數組來表示其整個范圍顯然是不合適的
   答案是利用HASH表,額...不是我自己想的,不過這個想法我是應該想到的,艾...繼續加油
   HASH, 相當強大而簡單的方案
   這里我是使用鏈接法來解決HASH沖突的

單向寬度優先搜索
剛提交的時候一直TLE, 結果我將HASH_MAX設置地更大之后,勉勉強強地通過了,汗...
 1 #define BOARD 8
 2 #define MOVE_MAX 8
 3 #define PRIME 100007
 4 #define HASH_MAX PRIME
 5 #define is_set(i, j, state) (state & (((unsigned long long)1)<<((i)*BOARD+(j))))
 6 #define set_bit(i, j, state) (state |= (((unsigned long long)1)<<((i)*BOARD+(j))))
 7 #define clear_bit(i, j, state) (state &= (~(((unsigned long long)1)<<((i)*BOARD+(j)))))
 8 #define is_valid(i, j) (i>=0 && i<BOARD && j>=0 && j<BOARD)
 9 struct Node {
10     /* 8x8 chessboard can be represented by 64 bits */
11     unsigned long long state;
12     short move;
13 }queue[635376];
14 unsigned long long begin, end;
15 const int dx[] = {00-11};
16 const int dy[] = {-1100};
17 int head, tail;
18 struct Hash {
19     unsigned long long *pstate;
20     struct Hash *next;
21 }hash_table[HASH_MAX];
22 
23 int
24 check_hash(unsigned long long value)
25 {
26     int index = value % PRIME;
27     struct Hash *= hash_table[index].next;
28     while(p != NULL) {
29         if(*(p->pstate) == value) 
30             return 1;
31         p = p->next;
32     }
33     return 0;
34 }
35 
36 void
37 insert_hash(unsigned long long *pstate, int index)
38 {
39     struct Hash *node = malloc(sizeof(struct Hash));
40     node->pstate = pstate;
41     node->next = hash_table[index].next;
42     hash_table[index].next = node;
43 }
44 
45 int
46 bfs()
47 {
48     int i, j, x, y, next_x, next_y, cnt, cur_move=0;
49     unsigned long long cur_state, next_state;
50     queue[tail].state = begin;
51     queue[tail].move = 0;
52     insert_hash(&(queue[tail].state), (queue[tail].state)%PRIME);
53     while(head<tail && cur_move<=MOVE_MAX) {
54         ++head;
55         cnt = 0;
56         cur_state = queue[head].state;
57         cur_move = queue[head].move;
58         if(cur_state == end)
59             return 1;
60         for(i=0; i<64 && cnt<4; i++) {
61             if(cur_state & (((unsigned long long)1)<<i)) {
62                 ++cnt;
63                 x = i/BOARD;
64                 y = i%BOARD; 
65                 for(j=0; j<4; j++) { /* left, right, up, down */
66                     next_x = x + dx[j];
67                     next_y = y + dy[j];
68                     if(!is_valid(next_x, next_y))
69                         continue;
70                     if(is_set(next_x, next_y, cur_state)) {
71                         next_x += dx[j];
72                         next_y += dy[j];
73                         if(!is_valid(next_x, next_y))
74                             continue;
75                     }
76                     /* make sure the next state never showed before */
77                     /* hash: one of the most powerful tools */
78                     next_state = cur_state;
79                     clear_bit(x, y, next_state);
80                     set_bit(next_x, next_y, next_state);
81                     if(!check_hash(next_state)) {
82                         ++tail;
83                         queue[tail].move = cur_move + 1;
84                         queue[tail].state = next_state;
85                         insert_hash(&(queue[tail].state), (queue[tail].state)%PRIME);
86                     } 
87                 }
88             }
89         }
90     }
91     return 0;
92 }

雙向寬度優先搜索
當我們知道開始和結束狀態的條件下,可以采用雙向寬度優先搜索
而且可以大大減小需要搜索的狀態數目,因為需要搜索的層數減少一半
  1 /* bidirectional BFS */
  2 /* Memory: 2704K Time: 47MS */
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<string.h>
  6 
  7 #define BOARD 8
  8 #define MOVE_MAX 8
  9 #define PRIME 10007
 10 #define HASH_MAX PRIME
 11 #define is_set(i, j, state) (state & (((unsigned long long)1)<<((i)*BOARD+(j))))
 12 #define set_bit(i, j, state) (state |= (((unsigned long long)1)<<((i)*BOARD+(j))))
 13 #define clear_bit(i, j, state) (state &= (~(((unsigned long long)1)<<((i)*BOARD+(j)))))
 14 #define is_valid(i, j) (i>=0 && i<BOARD && j>=0 && j<BOARD)
 15 struct Node {
 16     /* 8x8 chessboard can be represented by 64 bits */
 17     unsigned long long state;
 18     short move;
 19 }queue[63537], second_queue[63537];
 20 unsigned long long begin, end;
 21 const int dx[] = {00-11};
 22 const int dy[] = {-1100};
 23 int head, tail, second_head, second_tail;
 24 struct Hash {
 25     unsigned long long *pstate;
 26     struct Hash *next;
 27 }hash_table[HASH_MAX], second_hash_table[HASH_MAX];
 28 
 29 int
 30 check_hash(struct Hash *hash, unsigned long long value)
 31 {
 32     int index = value % PRIME;
 33     struct Hash *= hash[index].next;
 34     while(p != NULL) {
 35         if(*(p->pstate) == value) 
 36             return 1;
 37         p = p->next;
 38     }
 39     return 0;
 40 }
 41 
 42 void
 43 insert_hash(struct Hash *hash, unsigned long long *pstate, int index)
 44 {
 45     struct Hash *node = malloc(sizeof(struct Hash));
 46     node->pstate = pstate;
 47     node->next = hash[index].next;
 48     hash[index].next = node;
 49 }
 50 
 51 int
 52 bfs()
 53 {
 54     int i, j, x, y, next_x, next_y, cnt, cur_move, second_cur_move;
 55     cur_move = second_cur_move = 0;
 56     unsigned long long cur_state, next_state;
 57     queue[tail].state = begin;
 58     queue[tail].move = 0;
 59     insert_hash(hash_table, &(queue[tail].state), (queue[tail].state)%PRIME);
 60     second_queue[second_tail].state = end;
 61     second_queue[second_tail].move = 0;
 62     insert_hash(second_hash_table, &(second_queue[second_tail].state), (second_queue[second_tail].state)%PRIME);
 63     while(head<tail && second_head<second_tail) {
 64         ++head;
 65         cnt = 0;
 66         cur_state = queue[head].state;
 67         cur_move = queue[head].move;
 68         for(i=0; i<64 && cnt<4; i++) {
 69             if(cur_state & (((unsigned long long)1)<<i)) {
 70                 ++cnt;
 71                 x = i/BOARD;
 72                 y = i%BOARD; 
 73                 for(j=0; j<4; j++) { /* left, right, up, down */
 74                     next_x = x + dx[j];
 75                     next_y = y + dy[j];
 76                     if(!is_valid(next_x, next_y))
 77                         continue;
 78                     if(is_set(next_x, next_y, cur_state)) {
 79                         next_x += dx[j];
 80                         next_y += dy[j];
 81                         if(!is_valid(next_x, next_y))
 82                             continue;
 83                     }
 84                     /* make sure the next state never showed before */
 85                     /* hash: one of the most powerful tools */
 86                     next_state = cur_state;
 87                     clear_bit(x, y, next_state);
 88                     set_bit(next_x, next_y, next_state);
 89                     if(!check_hash(hash_table, next_state) && cur_move<MOVE_MAX/2) {
 90                         if(check_hash(second_hash_table, next_state)) 
 91                             return 1;
 92                         ++tail;
 93                         queue[tail].move = cur_move + 1;
 94                         queue[tail].state = next_state;
 95                         insert_hash(hash_table, &(queue[tail].state), (queue[tail].state)%PRIME);
 96                     } 
 97                 }
 98             }
 99         }
100         ++second_head;
101         cnt = 0;
102         cur_state = second_queue[second_head].state;
103         second_cur_move = second_queue[second_head].move;
104         for(i=0; i<64 && cnt<4; i++) {
105             if(cur_state & (((unsigned long long)1)<<i)) {
106                 ++cnt;
107                 x = i/BOARD;
108                 y = i%BOARD; 
109                 for(j=0; j<4; j++) {
110                     next_x = x + dx[j];
111                     next_y = y + dy[j];
112                     if(!is_valid(next_x, next_y))
113                         continue;
114                     if(is_set(next_x, next_y, cur_state)) {
115                         next_x += dx[j];
116                         next_y += dy[j];
117                         if(!is_valid(next_x, next_y))
118                             continue;
119                     }
120                     next_state = cur_state;
121                     clear_bit(x, y, next_state);
122                     set_bit(next_x, next_y, next_state);
123                     if(!check_hash(second_hash_table, next_state) && second_cur_move<MOVE_MAX/2) {
124                         if(check_hash(hash_table, next_state)) 
125                             return 1;
126                         ++second_tail;
127                         second_queue[second_tail].move = second_cur_move + 1;
128                         second_queue[second_tail].state = next_state;
129                         insert_hash(second_hash_table, &(second_queue[second_tail].state), (second_queue[second_tail].state)%PRIME);
130                     } 
131                 }
132             }
133         }
134     }
135     return 0;
136 }
137 
138 int
139 main(int argc, char **argv)
140 {
141     int i, j, k;
142     while(scanf("%d %d"&i, &j) != EOF) {
143         head = second_head = -1;
144         tail = second_tail = 0;
145         begin = end = 0;
146         set_bit(i-1, j-1, begin);
147         memset(hash_table, 0sizeof(hash_table));
148         memset(second_hash_table, 0sizeof(second_hash_table));
149         memset(queue, 0sizeof(queue));
150         memset(second_queue, 0sizeof(second_queue));
151         for(k=1; k<4; k++) {
152             scanf("%d %d"&i, &j);
153             set_bit(i-1, j-1, begin);
154         }
155         for(k=0; k<4; k++) {
156             scanf("%d %d"&i, &j);
157             set_bit(i-1, j-1, end);
158         }
159         printf("%s\n", bfs()==1 ? "YES" : "NO");
160     }
161 }


posted on 2010-07-05 11:56 simplyzhao 閱讀(190) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

導航

<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久女女女女999久久| 亚洲理伦在线| 亚洲小说欧美另类社区| 久久久成人精品| 麻豆成人在线| 亚洲精品视频在线| 欧美激情一区二区在线 | 亚洲高清久久网| 在线视频欧美一区| 亚洲综合色婷婷| 国产亚洲精品bt天堂精选| 午夜精品国产精品大乳美女| 午夜免费日韩视频| 黑人操亚洲美女惩罚| 久久野战av| 99精品视频免费全部在线| 亚洲欧美国产高清| 亚洲免费av片| 亚洲一区二区3| 久久九九久精品国产免费直播| 亚洲丰满在线| 欧美一级视频精品观看| 亚洲国产欧美在线人成| 久久精品国产在热久久| 国产精品99久久久久久久久久久久| 国产伦精品一区| 欧美成人免费大片| 久久9热精品视频| 亚洲先锋成人| 日韩视频精品| 亚洲黄色免费| 亚洲欧美卡通另类91av| 亚洲视频香蕉人妖| 久久一区二区三区国产精品 | 欧美性片在线观看| 久久婷婷国产综合精品青草 | 亚洲精品视频免费在线观看| 久久久av网站| 亚洲欧洲在线一区| 亚洲精品一区二区三区在线观看| 亚洲午夜女主播在线直播| 久久婷婷久久一区二区三区| 欧美无砖砖区免费| 亚洲黄一区二区| 伊人久久婷婷| 日韩午夜激情电影| 欧美在线亚洲在线| 亚洲欧美国产不卡| 亚洲第一在线综合在线| 亚洲欧美激情四射在线日| 欧美成人综合网站| 国产一区二区精品丝袜| 亚洲欧美日本在线| 亚洲精品免费电影| 亚洲国产精品久久久久久女王| 亚洲免费视频成人| 欧美日韩亚洲91| 欧美日韩免费网站| 亚洲高清资源| 美女国产精品| 亚洲国产精品久久久久婷婷老年| 欧美一二区视频| 欧美午夜一区| 一区二区三区精密机械公司| 亚洲一区欧美| 在线视频日本亚洲性| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲人www| 亚洲精选一区二区| 免费成年人欧美视频| 亚洲欧美日韩在线不卡| 国产精品v亚洲精品v日韩精品| 中文网丁香综合网| 日韩一区二区精品视频| 国产精品久久久久av免费| 国产色综合久久| 影音先锋日韩资源| 另类av一区二区| 毛片精品免费在线观看| 欧美日韩一区二区在线| 日韩午夜精品| 久久精品成人一区二区三区蜜臀| 亚洲欧美美女| 影音国产精品| 亚洲精品专区| 国产女主播视频一区二区| 亚洲国产岛国毛片在线| 亚洲电影欧美电影有声小说| 欧美日本免费一区二区三区| 国产精品一区二区你懂得| 久久青草福利网站| 亚洲在线一区二区| 欧美人与性禽动交情品 | 久久av老司机精品网站导航| 欧美在线视频一区二区三区| 国产亚洲欧洲| 亚洲全部视频| 国产精品乱看| 国产精品99久久久久久久女警 | 亚洲一区成人| 欧美一级淫片aaaaaaa视频| 亚洲国产成人精品女人久久久| 亚洲缚视频在线观看| 国产精品一二三四| 欧美激情欧美激情在线五月| 欧美有码在线视频| 亚洲毛片在线观看.| 亚洲午夜未删减在线观看| 亚洲第一综合天堂另类专| 欧美在线视频全部完| 久久久综合精品| 亚洲欧美另类中文字幕| 模特精品裸拍一区| 亚洲日本欧美| 久久精品99| 在线日韩av永久免费观看| 亚洲一区二区三区四区五区黄 | 欧美制服丝袜| 欧美午夜剧场| 日韩性生活视频| 亚洲伦理自拍| 欧美插天视频在线播放| 久久亚洲一区二区三区四区| 亚洲美女性视频| 亚洲激情在线激情| 久久深夜福利免费观看| 久久久久国产一区二区| 国产精品麻豆欧美日韩ww| 日韩午夜激情av| 亚洲神马久久| 欧美日韩亚洲一区三区| 亚洲人成7777| 一区二区免费在线观看| 欧美激情麻豆| 亚洲精品美女| 亚洲欧美日韩国产一区| 欧美性视频网站| 亚洲午夜久久久| 久久高清福利视频| 国内久久精品| 99国产精品视频免费观看一公开| 91久久精品一区二区别| 欧美大片国产精品| 亚洲日本视频| 亚洲欧美www| 国产九九视频一区二区三区| 亚洲欧美在线一区| 老司机免费视频一区二区| 亚洲国产精品电影在线观看| 欧美日韩国产不卡在线看| 欧美日韩爆操| 99国产精品久久久| 亚洲欧美成人一区二区在线电影| 国产精品毛片| 久久精品1区| 最新国产乱人伦偷精品免费网站| av成人黄色| 久久久噜噜噜久噜久久| 欧美α欧美αv大片| 国产伦精品一区二区三区视频孕妇| 一区二区三欧美| 亚洲国产精品久久人人爱蜜臀| 久久在线91| 欧美自拍偷拍| 亚洲第一网站免费视频| 欧美日韩国产影院| 亚洲欧美日韩综合国产aⅴ| 久久理论片午夜琪琪电影网| 亚洲人成人一区二区三区| 国产精品成人一区二区网站软件 | 在线观看成人小视频| 欧美1级日本1级| 亚洲一卡二卡三卡四卡五卡| 久久综合九色综合欧美就去吻| 99在线精品观看| 韩日精品中文字幕| 欧美调教视频| 久久久久久97三级| 91久久精品www人人做人人爽| 欧美视频导航| 久久久亚洲影院你懂的| 亚洲视频二区| 亚洲国产欧美在线 | 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 中文av一区特黄| 亚洲国产精品999| 国产精品美女久久久久久久| 欧美 日韩 国产在线| 久久国产色av| 亚洲永久在线观看| 亚洲美女啪啪| 亚洲欧洲精品成人久久奇米网 | 麻豆精品精华液| 亚洲永久免费观看| 99国产一区| 亚洲欧洲日韩在线| 樱花yy私人影院亚洲| 国产在线视频不卡二| 国产麻豆综合| 国产精品自拍视频|