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

阅读排行榜

评论排行榜

/*
ID:superlo1
LANG:C++
TASK:clocks
*/


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

int ini[9];
int move[10][10= {{},
    {
1,1,0,1,1,0,0,0,0},{1,1,1,0,0,0,0,0,0},
    {
0,1,1,0,1,1,0,0,0},{1,0,0,1,0,0,1,0,0},
    {
0,1,0,1,1,1,0,1,0},{0,0,1,0,0,1,0,0,1},
    {
0,0,0,1,1,0,1,1,0},{0,0,0,0,0,0,1,1,1},
    {
0,0,0,0,1,1,0,1,1}
    };

inline 
int calc(int num[])
{
    
int sum = 0base = 1;
    
for(int i = 0; i <= 8; i ++)
    {
        sum 
+= num[i]*base;
        
base *= 4;
    }
    
return sum; 
}

inline 
void decode(int state, int num[])
{
    
for(int i = 0; i < 9; i ++)
    {
        num[i] 
= state % 4;
        state 
/= 4;
    }
}

void read()
{
    
for(int i = 0; i < 9; i ++)
    {
        scanf(
"%d"&ini[i]);
        ini[i] 
= (ini[i] / 3% 4;
    }
    
int num[9];
    decode(calc(ini), num);
    
//for(int i = 0; i < 9; i ++) printf("%d ", num[i]);
    
//puts("");
}

int  q[300000];
int  way[300000];
int  step[300000];
bool h[300000];
int close, open;

bool ok(int s)
{
    
if(s == 0return true;
    
return false;
}

void out()
{
    
int cnt = 0, ans[10000], state;
    state 
= open;
    
while(state > 0)
    {
        ans[cnt
++= step[state];
        state 
= way[state];
    }
    printf(
"%d", ans[cnt-1]);
    
for(int i = cnt - 2; i >= 0; i --) printf(" %d", ans[i]);puts("");
}

bool expend(int state)
{
    
int num[9], nnum[9];
    decode(state, num);
    
//system("pause");
    for(int i = 1; i <= 9; i ++)
    {
        
for(int j = 0; j < 9; j ++)
            nnum[j] 
= (num[j] + move[i][j]) % 4;
        
        
//printf("%d:", i);
        int nstate = calc(nnum);
        
if(h[nstate]) continue;
        
//for(int j = 0; j < 9; j ++) printf("%d ", nnum[j]); puts("");
        h[nstate] = 1;
        q[
++open] = nstate;
        way[open] 
= close;
        step[open] 
= i;
        
if(ok(nstate)) return 1;
    }
    
return 0;
}

void bfs()
{
    
int num[9];
    close 
= -1, open = 0;
    
int temp = calc(ini);
//    printf("%d\n", temp);
    memset(h,0,sizeof(h));
    q[
0= temp;
    h[temp] 
= 1;
    way[
0= -1;
    
while(close < open)
    {
        
int size = open - close;
        
//printf("%d:\n", step);
        while(size --)
        {
            temp 
= q[++close];
            
int num[9];
            decode(temp, num);
            
//puts("flag");
            
//for(int j = 0; j < 9; j ++) printf("%d ", num[j]); puts(":");
            if(expend(temp))
            {
                
out();            
                
return;
            }
        }
    }
}

int main()
{
    freopen(
"clocks.in","r",stdin);
    freopen(
"clocks.out","w",stdout);
    read();
    bfs();
    
//while(1);
}

posted on 2009-10-15 20:05 superlong 阅读(131) 评论(0)  编辑 收藏 引用 所属分类: USACO

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