晓天动漫

Coding yy life……

Timus 1016. A Cube on the Walk


bfs,很基础的。可以看作在一个图上跑最短路,关健是建图,本人愚拙,手打整个图。


  1 /*
  2  * File:   1016. A Cube on the Walk
  3  * Author: xiaotian @ hnu
  4  * Created on 2010年9月28日, 上午9:26
  5  * 解题:bfs,很基础的。可以看作在一个图上跑最短路,
  6  * 关健是建图,本人愚拙,手打整个图。
  7  */
  8 
  9 #include<stdio.h>
 10 #include<iostream>
 11 #include<string.h>
 12 #include<queue>
 13 #define inf 0x3fffffff
 14 using namespace std;
 15 const int dy[4]={0,-1,0,1};
 16 const int dx[4]={1,0,-1,0};
 17 int map[6][6][4][2]=
 18 {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,2,1,5,2,4,0,4,3,3,1,2,3,5,0,5,4,4,1,3,4,2,0,2,5,5,1,4,5,3,0},
 19 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,2,0,3,2,4,1,2,3,3,0,4,3,5,1,3,4,4,0,5,4,2,1,4,5,5,0,2,5,3,1},
 20 {5,0,0,4,3,0,1,2,3,1,1,4,5,1,0,2,0,0,0,0,0,0,0,0,0,3,3,4,1,3,5,2,0,0,0,0,0,0,0,0,1,5,5,4,0,5,3,2},
 21 {2,0,0,5,4,0,1,3,4,1,1,5,2,1,0,3,1,2,2,5,0,2,4,3,0,0,0,0,0,0,0,0,0,4,4,5,1,4,2,3,0,0,0,0,0,0,0,0},
 22 {3,0,0,2,5,0,1,4,5,1,1,2,3,1,0,4,0,0,0,0,0,0,0,0,1,3,3,2,0,3,5,4,0,0,0,0,0,0,0,0,0,5,5,2,1,5,3,4},
 23 {4,0,0,3,2,0,1,5,2,1,1,3,4,1,0,5,0,2,2,3,1,2,4,5,0,0,0,0,0,0,0,0,1,4,4,3,0,4,2,5,0,0,0,0,0,0,0,0}};
 24 int num[6];
 25 int g[10][10][6][6];
 26 struct point
 27 {
 28     int x,y,b,f;
 29     point(int xx=0,int yy=0,int bb=0,int ff=0):x(xx),y(yy),b(bb),f(ff){}
 30 };
 31 struct node
 32 {
 33     int x,y;
 34     node(int xx=0,int yy=0):x(xx),y(yy){}
 35 };
 36 node out[1000];
 37 point pre[10][10][6][6];
 38 point s,t;
 39 int ok(int x,int y){ return x>=0 && x<8 && y>=0 && y<8; }
 40 void bfs()
 41 {
 42     for(int i=0;i<10;i++)
 43         for(int j=0;j<10;j++)
 44             for(int k=0;k<6;k++)
 45                 for(int l=0;l<6;l++) g[i][j][k][l]=inf;
 46     queue<point>q;
 47     g[s.x][s.y][s.b][s.f]=num[s.b];
 48     pre[s.x][s.y][s.b][s.f]=point(-1,-1,-1,-1);
 49     q.push(s);
 50     while(!q.empty())
 51     {
 52         point p=q.front(); q.pop();
 53         int k=g[p.x][p.y][p.b][p.f];
 54         for(int i=0;i<4;i++)
 55         {
 56             int x=p.x+dx[i],y=p.y+dy[i];
 57             int b=map[p.b][p.f][i][0];
 58             int f=map[p.b][p.f][i][1];
 59             if(ok(x,y) && k+num[b]<g[x][y][b][f])
 60             {
 61                 pre[x][y][b][f]=p;
 62                 q.push(point(x,y,b,f));
 63                 g[x][y][b][f]=k+num[b];
 64             }
 65         }
 66     }
 67 }
 68 int main() {
 69     char s1[10],s2[10];
 70     while(scanf("%s %s",s1,s2)!=EOF)
 71     {
 72         s=point(s1[0]-'a',s1[1]-'1',4,0);
 73         t=point(s2[0]-'a',s2[1]-'1',-1,-1);
 74         for(int i=0;i<6;i++) scanf("%d",num+i);
 75         bfs();
 76         int ans=inf;
 77         for(int i=0;i<6;i++)
 78             for(int j=0;j<6;j++)
 79             {
 80                 if(ans>g[t.x][t.y][i][j])
 81                 {
 82                     ans=g[t.x][t.y][i][j];
 83                     t.b=i;
 84                     t.f=j;
 85                 }
 86             }
 87         printf("%d ",ans);
 88         out[0]=node(t.x,t.y);
 89         int tot=1;
 90         point k=t;
 91         while(k.x!=-1 && k.y!=-1 && k.b!=-1 && k.f!=-1)
 92         {
 93             k=pre[k.x][k.y][k.b][k.f];
 94             out[tot++]=node(k.x,k.y);
 95         }
 96         tot--;
 97         for(int i=tot-1;i>=0;i--)
 98         {
 99             printf("%c%d",out[i].x+'a',out[i].y+1);
100             if(out[i].x==t.x && out[i].y==t.y) { printf("\n"); break; }
101             else printf(" ");
102         }
103     }
104     return 0;
105 }

posted on 2010-09-29 00:07 晓天_xiaotian 阅读(1304) 评论(3)  编辑 收藏 引用 所属分类: 搜索专版

评论

# re: Timus 1016. A Cube on the Walk 2010-09-29 23:17 晓天_xiaotian

@evening dresses
没看懂您的留言……  回复  更多评论   

# re: Timus 1016. A Cube on the Walk 2010-09-30 16:35 schindlerlee

打酱油路过。。  回复  更多评论   


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


导航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿

随笔分类

随笔档案

相册

收藏夹

ACM Online Judge

搜索

最新评论

阅读排行榜

评论排行榜