学习心得(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

阅读排行榜

评论排行榜

#include <iostream>
#include 
<string.h>
#include 
<queue>

using namespace std;

bool h[2][370000];
int step;

typedef 
struct nod
{
    
char s[10];
    nod(){}
    
void write(){
        puts(s);
    }
}cstring;


queue
< cstring > q[2];

int sta[3][3], end[3][3];

inline 
void read(int st[][3])  //读入函数 
{
    
for(int i = 0; i < 3; i ++)
    
for(int j = 0; j < 3; j ++)
        scanf(
"%d"&st[i][j]);
}

inline 
int nx(cstring str)      //求逆序数 
{
    
int l = strlen(str.s), i, j, num;
    num 
= 0;
    
for(i = 0; i < l; i ++)
    {
        
if(str.s[i] == '0'continue;
        
for(j = 0; j < i; j ++)
        
if(str.s[j] > str.s[i]) num ++;
    }
    
//printf("%d\n",num);
    return num;
}

inline 
int map(cstring str)        //映射 
{
    
int i, j, base, cnt, hash;
    
base  = 1; hash = 0;
    
for(i = 0; i < 9; i ++)
    {
        
if(str.s[i] == '0') str.s[i] = '9';
        
if(base == 0base = 1;
        
base *= i; cnt = 0;
        
for(j = 0; j < i; j ++)
        
if(str.s[j] > str.s[i]) cnt ++;
        hash 
+= base * cnt;
    }
    
return hash;
}

inline 
void swap(char &a, char &b)   //交换函数 
{
    
char c = a; a = b; b = c;
}

void change(cstring &tp, int dic) //4种扩展 
{
    
int i, j, l = strlen(tp.s);
    
char tmp;
    
//up right down left

    
for(i = 0; i < l; i ++)
    
if(tp.s[i] == '0'break;
    
if(dic == 0 && i > 2
        swap(tp.s[i], tp.s[i 
- 3]);
    
else if(dic == 1 && i % 3 != 2
        swap(tp.s[i], tp.s[i 
+ 1]);
    
else if(dic == 2 && i < 6)
        swap(tp.s[i], tp.s[i 
+ 3]);
    
else if(dic == 3 && i % 3 != 0)
        swap(tp.s[i], tp.s[i 
- 1]);
    
else strcpy(tp.s, " ");

}

int extend(int index, cstring st) //扩展函数 
{
    cstring tp;
    
int i, j, l = strlen(st.s), hash;  
    
for(i = 0; i < 4; i ++)
    {
        strcpy(tp.s ,st.s);
        change(tp, i);
        
if(strcmp(tp.s," "))
        {
            
//tp.write();
            hash = map(tp);
            
if(h[index][hash]) continue;
            
if(h[1 - index][hash]) return true;
            q[index].push(tp);
            h[index][hash] 
= 1;
        }
    }
    
return false;



void atos(int arr[3][3], cstring &tp_atos) //把数组变成cstring 
{
    
int i, j;
    
for(i = 0; i < 3; i ++)
    
for(j = 0; j < 3; j ++)
        tp_atos.s[i 
* 3 + j] = arr[i][j] + '0';
    tp_atos.s[
9= '\0';
}

int bfs()
{
    cstring 
as, ed;
    
while(!q[0].empty()) q[0].pop();
    
while(!q[1].empty()) q[1].pop();
    memset(h,
0,sizeof(h));
    atos(sta, 
as);
    atos(end, ed);
    
if(nx(as% 2 != nx(ed) % 2return -1;//逆序奇偶性不同 
    q[0].push( as );
    q[
1].push( ed );
    h[
0][map( as )] = 1;
    h[
1][map( ed )] = 1;
    
if(h[0][map( ed )]) return 0;              //两个相同 
    int index, size;
    step 
= 0;
    cstring temp;
    
while!q[0].empty() || !q[1].empty() )
    {
        index 
= 0;
        
if( q[0].size() > q[1].size() ) index = 1//取size小的先扩展 
        if( q[index].empty() ) index = 1 - index;
        size 
= q[index].size();
        
while(size --)
        {
            temp 
= q[index].front();  
            
//temp.write();
            q[index].pop();
            
if( extend(index, temp) ) return step + 1;  //扩展 
        }
        step 
++;
    }
}

int main()
{
    
int ans = 0;
    read(sta);    
    read(end);
    ans 
= bfs();
    printf(
"%d\n",ans);
}

posted on 2009-08-22 20:27 superlong 阅读(136) 评论(0)  编辑 收藏 引用

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