| ||||||||||
| 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 | |||||||||
之前WA和TLE了好几次,折腾了一天终于AC了,G++提交500MS,BFS+位运算,纪念一下之前WA和TLE了好几次,折腾了一天终于AC了,G++提交500MS,BFS+位运算,纪念一下。
在自己电脑上运行是20ms,提交是500ms。
有几点地方要注意下:
1、BFS遍历时候,循环变量为i应该用flip_num[15-i],否则答案不对。
2、位运算最好先把16种要取反运算的值用数组存flip_num起来,否则有可能超时间。
AC code:
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int MAX_STATE = 65536;
const int ALL_OPEN = 0;
const int SIZE = 4;
vector<int> state(MAX_STATE, -1), pre(MAX_STATE, -1);
int current_state = 0; // use the low 16 bits of int
// to store the current state in reverse order
int flip_num[16] = {63624,62532,61986,61713,36744,20292,12066,7953,35064,
17652,8946,4593,34959,17487, 8751, 4383};
int input(istream& in);
void solve();
int main()
{
input(cin);
solve();
return 0;
}
int convert(char c); // convert '+' and '-' to 1 and 0
int input(istream& in)
{
current_state = 0;
char c;
for (int i = 0; i < SIZE * SIZE; i++) {
in >> c;
current_state += (convert(c) << i);
}
return 1;
}
int convert(char c)
{
if (c == '+')
return 1;
else
return 0;
}
void process_solution();
void solve()
{
queue<int> q;
int next_state;
state[current_state] = 0;
q.push(current_state);
while (!q.empty()) {
current_state = q.front(); q.pop();
for (int i = 0; i < SIZE * SIZE; i++) {
next_state = current_state ^ flip_num[15 - i];
if (next_state == ALL_OPEN) {
pre[next_state] = i;
state[next_state] = state[current_state] + 1;
process_solution();
return ;
}
if (state[next_state] == -1) {
state[next_state] = state[current_state] + 1;
pre[next_state] = i;
q.push(next_state);
}
}
}
}
void process_solution()
{
stack<int> s;
int tmp;
cout << state[0] << endl;
for (int i = 0; pre[i] != -1; i ^= flip_num[15 - pre[i]])
s.push(pre[i]);
while (!s.empty()) {
tmp = s.top(); s.pop();
cout << (tmp / 4 + 1) << " " << (tmp % 4 + 1) << endl;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator