http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1416
BFS题哈..这题很纠结.搞了很长时间..想节省一下空间.结果却花了我半天时间,一直找不到错误.后来上98去发帖.在t_nt的帮助下终于发现错
误,原来搞错了进制啊..
这道题是对四个数一次进行BFS,BFS的时候进行四种操作: 左右互换,自增,自减.然后将得到的四个值放入队列中,并且将那种状态标记为true.
就在这里我犯了一个大错.因为他的数的范围是[1,9],然后我就开了一个6561大小的数组,但是在保存状态时,我却用十进制去表示.哎..其实
本来将数组开成10 * 10 * 10 * 10就不会犯这种错误了..
看代码吧
/* * 2416.cpp * * Created on: Apr 29, 2010 * Author: wyy * */ #include<cstdio> #include<queue> using namespace std; char str[5]; int Start[4]; int End[4]; bool marked[6561]; int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; struct lock { int num[4]; int ret; }; void Init() { scanf("%s", str); for(int i = 0; i < 4; ++i) Start[i] = str[i] - '0'; scanf("%s", str); for(int i = 0; i < 4; ++i) End[i] = str[i] - '0'; for(int i = 0; i < 6561; ++i) marked[i] = false; } void BFS() { queue<lock> Q; lock m, n; int flag, sum; for(int i = 0; i < 4; ++i) m.num[i] = Start[i]; sum = (Start[0] - 1) * 729 + (Start[1] - 1) * 81 + (Start[2] - 1) * 9 + Start[3] - 1; marked[sum] = true; m.ret = 0; Q.push(m); while(!Q.empty()) { m = Q.front(); Q.pop(); for(flag = 0; flag < 4; ++flag) if(m.num[flag] != End[flag]) break; if(flag == 4) { printf("%d/n", m.ret); break; } for(int i = 0; i < 4; ++i) //deal with 4 numbers for(int j = 0; j < 4; ++j) //deal with 4 conditions: swap, ++, -- { for(int k = 0; k < 4; ++k) n.num[k] = m.num[k]; int x = m.num[i] + dx[j]; int y = i + dy[j]; if(dy[j] != 0 && y >= 0 && y < 4) // swap { n.num[i] = m.num[y]; n.num[y] = m.num[i]; } else if(dx[j] != 0) // ++ or -- n.num[i] = (x + 8) % 9 + 1; sum = (n.num[0] - 1) * 729 + (n.num[1] - 1) * 81 + (n.num[2] - 1) * 9 + n.num[3] - 1; if(!marked[sum]) { marked[sum] = true; n.ret = m.ret + 1; Q.push(n); } } } } int main() { //freopen("input.txt", "r", stdin); int N; scanf("%d", &N); while(N--) { Init(); BFS(); } //fclose(stdin); return 0; }