学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

搜索,把所有能走的点映射一下(这些点不多,最多100多个),状态就是100*100*100的

#include <stdio.h>
#include 
<string.h>

const int N = 55;
const int M = 105;

int n, m;
char str[N][N];
int map[N][N];
int Xend[M], numB, numX;
int dic[M][5];
int len[M];
int move[4][2= {{0 , 1}, {0-1}, {10}, {-10}};
bool h[M][M][M];
int flagB, flagX;

struct node {
    
int me, b1, b2;
    
void write() {
        printf(
"%d %d %d\n", me, b1, b2);
    }
};

inline 
bool ok (int i, int j) {
    
if( i < 0 || i >= n || j < 0 || j >= m ) return false;
    
if( str[i][j] == '#'return false;
    
return true;
}

void read() {
    scanf(
"%d %d"&n, &m);
    
for(int i = 0; i < n; i ++) {
        scanf(
"%s", str[i]);
    }
}

int close, open, cnt;
int f, e, b[2];
node que[
1000001];

void pre() {
    
int tp = 1;
    cnt 
= 1;
    memset(map, 
0sizeof(map));
    memset(Xend, 
0sizeof(Xend));
    close 
= -1; open = 0;
    que[
0].me = que[0].b1 = que[0].b2 = 0;
    flagX 
= flagB = 0;
    b[
0= b[1= 0;
    numB 
= 0; numX = 0;
    
for(int i = 0; i < n; i ++) {
        
for(int j = 0; j < m; j ++) {
            
if( str[i][j] == '.' ) map[i][j] = cnt++;
            
if( str[i][j] == 'S' ) {map[i][j] = cnt; f = cnt++;}
            
if( str[i][j] == 'E' ) {map[i][j] = cnt; e = cnt++;}
            
if( str[i][j] == 'X' ) {
                numX 
++;
                flagX 
= 1;
                map[i][j] 
= cnt;
                
if( tp == 1)     que[open].b1 = cnt;
                
else             que[open].b2 = cnt;
                cnt 
++;
                tp 
++;
            }
            
if( str[i][j] == 'B') {
                numB 
++;
                flagB 
= 1;
                Xend[cnt] 
= 1;
                map[i][j] 
= cnt++;
            }
        }
    }
    Xend[
0= 1;
    que[open].me 
= f;
}

void build() {
    
for(int i = 0; i < n; i ++) {
        
for(int j = 0; j < m; j ++) {
            
if( ok(i, j) ) {
                
for(int k = 0; k < 4; k ++) {
                    
if( ok(i+move[k][0], j+move[k][1]) ) {
                        dic[map[i][j]][k] 
= map[i+move[k][0]][j+move[k][1]];
                    } 
else {
                        dic[map[i][j]][k] 
= -1;
                    }
                }
            }
        }
    }
}

inline 
bool end(node a) {
    
if( a.me != e ) return false;
    
if!flagB ) return true;
    
if( numX == 1 && Xend[a.b1]  ) return true;
    
if( Xend[a.b1] && Xend[a.b2] ) return true;
    
return false;
}

bool expand(node now) {
    node next;
    
for(int i = 0; i < 4; i ++) {
        next.me 
= dic[now.me][i];
        next.b1 
= now.b1;
        next.b2 
= now.b2;
        
if( next.me == -1 ) continue;
        
if( now.b1 == next.me && dic[now.b1][i] != -1 ) {
            next.b1 
= dic[now.b1][i];
            next.b2 
= now.b2;
        } 
else if( now.b2 == next.me && dic[now.b2][i] != -1 ) {
            next.b2 
= dic[now.b2][i];
            next.b1 
= now.b1;
        } 
else if( now.b1 != next.me && now.b2 != next.me ) {
            next.b1 
= now.b1;
            next.b2 
= now.b2;
        } 
else {
            
continue;
        }
        
if( next.b1 == next.b2 && next.b1 != 0 ) continue;
        
if( h[next.me][next.b1][next.b2] ) continue;
        
if( end(next) ) return true;
        h[next.me][next.b1][next.b2] 
= 1;
        que[
++open] = next;
    }
    
return false;
}

int bfs() {
    
if( flagB && !flagX) return -1;
    
if( numB > numX ) return -1;
    
int step = 0, size = 0;
    memset(h, 
0sizeof(h));
    h[que[
0].me][que[0].b1][que[0].b2] = 1;
    node now;
    
while( close < open ) {
        size 
= open - close;
        
while( size -- ) {
            now 
= que[++close];
            
if( expand(now) ) {
                
return step + 1;
            }
        }
        step 
++;
    }
    
return -1;
}

int main() {
    freopen(
"testdata.in""r", stdin);
    
int t;
    scanf(
"%d"&t);
    
while( t -- ) {
        read();
        pre();
        build();
        
int ans = bfs();
        
if( ans != -1 )    printf("%d\n", ans);
        
else            printf("impossible\n");
    }
    
while(1);
}

posted on 2010-08-01 17:16 superlong 阅读(84) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理