Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:求问各位好人,我是用bfs 加位运算做的,但是不知道为什么runtime errorIn Reply To:求问各位好人,我是用bfs 加位运算做的,但是不知道为什么runtime error Posted by:liuhighway at 2011-03-22 10:42:48 BFS+位运算 900MS左右过了。。。 代码: #include<iostream> using namespace std; #define HANDLES 16 #define MAX 65536 int Queue[MAX]; int front, rear; //队列Queue头尾游标 bool isVis[MAX]; //记录状态是否已经出现过 int step[MAX]; //记录到达成功状态所需翻转次数 int Move[MAX]; //记录BFS过程当前已改变的位置 int start, end;//队列Move头尾游标 //十进制转二进制 void output(unsigned int d, char *str) { int nStart = -1, i = 0; for (i = 0; i < 32; i++) { bool bOne = (0 != (d & (1 << (32 - i - 1)))); if (bOne && nStart < 0) { nStart = i; } str[i - nStart] = bOne ? '1' : '0'; } str[i - nStart] = '\0'; } int main() { char bzero[HANDLES]; char bzeroPut[HANDLES]; for (int i = 0; i < HANDLES; ++i) { bzeroPut[i] = '0'; } char ch; int state = 0; int stateTemp = 0; int move = 0; int moveTemp = 0; //'-' means open, '+' means closed. for (int i = 0; i < HANDLES; ++i) { cin >> ch; state <<= 1; if (ch == '-') state += 1; } start = end = front = rear = 0; Queue[rear++] = state; //将初始状态state入队 isVis[state] = true; step[state] = 0; //到达初始状态所需次数为0 //如果队列不为空,继续操作 while (front < rear) { stateTemp = Queue[front++]; //将队头元素出队 //保存队头元素到state中 state = stateTemp; moveTemp = start < end ? Move[start++] : 0; //将队头元素出队 move = moveTemp; //需要遍历队头元素的16种操作 for (int site = 0; site < HANDLES; ++site) { //每次都要还原stateTemp stateTemp = state; //每次都要还原moveTemp moveTemp = move; /*******改变site位置的handle前,设置要改变的位置*******/ int op = 0; int opTemp = 0; int x, y;//横纵坐标 x = site / 4; y = site % 4; //改变一行 for (int i = x * 4; i < (x + 1) * 4; ++i) { opTemp = 1; opTemp <<= (HANDLES - 1 - i); op += opTemp; } //改变一行和改变一列时重复改变了位置(x,y),故需再进行一次改变 opTemp = 1; opTemp <<= (HANDLES - 1 - site); op -= opTemp; //改变一列 for (int j = y; j <= y + 12; j += 4) { opTemp = 1; opTemp <<= (HANDLES - 1 - j); op += opTemp; } /*******改变site位置的handle前,设置要改变的位置*******/ //改变site位置的handle stateTemp ^= op; //判断是否成功 if (stateTemp == 65535) { cout << step[state] + 1 << endl; //记录移动的位置 opTemp = 1; opTemp <<= site; moveTemp |= opTemp; output(moveTemp, bzero); int bzeroLength = 0; while (bzero[bzeroLength] == '0' || bzero[bzeroLength] == '1') bzeroLength++; for (int i = bzeroLength - 1, j = HANDLES - 1; i >= 0 && j >= 0; i--, j--) { bzeroPut[j] = bzero[i] == '1' ? '1' : '0'; } for (int i = HANDLES - 1; i >= 0; i--) { if (bzeroPut[i] == '1') { cout << (HANDLES - 1 - i) / 4 + 1 << " " << (HANDLES - 1 - i) % 4 + 1 << endl; } } return 0; } //如果是新的状态,入队 if (!isVis[stateTemp]) { Queue[rear++] = stateTemp; isVis[stateTemp] = true; step[stateTemp] = step[state] + 1; //当前次数=到达队头元素所需次数 + 1 //记录移动的位置 opTemp = 1; opTemp <<= site; moveTemp |= opTemp; Move[end++] = moveTemp; } } } output(state, bzero); printf("%s\n", bzero); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator