正文

Zju 2416 Open the Lock2006-09-14 23:05:00

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

分享到:

2067137 2006-09-14 22:42:54 Accepted 2416 C++ 00:00.89 956K St.Crux

    看来我要好好练习,bfs也可以编的很复杂。比如......1649的迷宫我已经WrongAnswer了十来遍了,每一遍都能激动地发现新的错误、作出愉快的改正,然后继续陷入郁闷。

    这题还算基本的bfs,一遍ac的感觉真好。STL虽然占内存,也有他的好处。用上queue以后,我就不用再模拟队列了。

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
using namespace std;

int n, b[10000], pi, si;
string s, p;
queue <string> sq, tq;

void init();
int stoi(string);
void bfs();
void print();

int main()
{
 //freopen("in.txt", "r", stdin);
 cin >> n;
 int i;
 for(i = 0; i < n; i ++)
 {
  cin >> s >> p;
  init();
  bfs();
  print();
 } 
 return 0;
}

void init()
{
 pi = stoi(p);
 si = stoi(s);
 memset(b, 0, sizeof(b));
 b[si] = 1;
 sq = tq;
 sq.push(s);
}

int stoi(string str)
{
 int sum = 0, i;
 for(i = 0; i < 4; i ++)
 {
  sum *= 10;
  sum += str[i] - '0';
 }
 return sum;
}

void bfs()
{
 string ts, ss;
 int ti, ii, l, i;
 while(!sq.empty())
 {
  ts = sq.front();
  ti = stoi(ts);
  l = b[ti];
  if(ti == pi) break;
  for(i = 0; i < 3; i ++)
  {
   ss = ts;
   char tc = ss[i];
   ss[i] = ss[i + 1];
   ss[i + 1] = tc;
   ii = stoi(ss);
   if(!b[ii])
   {
    b[ii] = l + 1;
    sq.push(ss);
   }
  }
  for(i = 0; i < 4; i ++)
  {
   ss = ts;
   ss[i] = (ss[i] != '9') ? ss[i] + 1 : '1';
   ii = stoi(ss);
   if(!b[ii])
   {
    b[ii] = l + 1;
    sq.push(ss);
   }
   ss = ts;
   ss[i] = (ss[i] != '1') ? ss[i] - 1 : '9';
   ii = stoi(ss);
   if(!b[ii])
   {
    b[ii] = l + 1;
    sq.push(ss);
   }
  }
  sq.pop();
 }
}

void print()
{
 printf("%d\n", b[pi] - 1);
}

 


 

阅读(3992) | 评论(0)


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

评论

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