正文

Zju 1103 Hike on a Graph2006-08-16 19:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17624.html

分享到:

2025283 2006-08-16 19:12:19 Accepted 1103 C++ 00:00.07 1544K St.Crux 这个题其实不难。可是我用了半个下午的时间研究如何dp......这件事告诉我一个深刻的道理......下次用一个小时研究就可以了。 好吧,这个题还是有写头滴,幸好queue让我简便了不少。还有一开始看错题意,每一枚棋子是不能同时移动的。 #include <iostream>#include <fstream>#include <queue>#include <cstring>using namespace std; class pt{public: int i, k, j, c;}; queue<pt> pq, tq, ttq;int n, p1, p2, p3, b[50][50][50], ans;char a[50][50]; void init(){ p1 --, p2 --, p3 --; memset(b, 0, sizeof(b)); ans = -1; pq = tq; b[p1][p2][p3] = 1; pt tpt; tpt.i = p1, tpt.k = p2, tpt.j = p3, tpt.c = 0; pq.push(tpt);} void bfs(){ while(!pq.empty()) {  //pb();  pt tpt, ttpt;  int i, k, j;  tpt = pq.front();  if(tpt.i == tpt.k && tpt.k == tpt.j)  {   ans = tpt.c;   break;  }  for(i = 0; i < n; i ++)  {   if(a[tpt.j][tpt.k] == a[tpt.i][i])   {    k = tpt.k, j = tpt.j;    if(!b[i][k][j])    {     b[i][k][j] = 1;     ttpt.i = i, ttpt.j = j, ttpt.k = k, ttpt.c = tpt.c + 1;     pq.push(ttpt);    }   }  }  for(k = 0; k < n; k ++)  {   if(a[tpt.j][tpt.i] == a[tpt.k][k])   {    i = tpt.i, j = tpt.j;    if(!b[i][k][j])    {     b[i][k][j] = 1;     ttpt.i = i, ttpt.j = j, ttpt.k = k, ttpt.c = tpt.c + 1;     pq.push(ttpt);    }   }  }  for(j = 0; j < n; j ++)  {   if(a[tpt.i][tpt.k] == a[tpt.j][j])   {    k = tpt.k, i = tpt.i;    if(!b[i][k][j])    {     b[i][k][j] = 1;     ttpt.i = i, ttpt.j = j, ttpt.k = k, ttpt.c = tpt.c + 1;     pq.push(ttpt);    }   }  }  pq.pop(); }}    int main(){ //ifstream cin("in.txt"); while(cin >> n && n) {  cin >> p1 >> p2 >> p3;  int i, k;  for(i = 0; i < n; i ++)  {   for(k = 0; k < n; k ++)   {    cin >> a[i][k];   }  }  init();  bfs();  if(ans != -1)   printf("%d\n", ans);  else   printf("impossible\n"); } return 0;}  

阅读(3914) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册