正文

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);}    

阅读(4134) | 评论(0)


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

评论

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