| ||||||||||
| 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:还没我单向的快呢……In Reply To:双向bfs 469MS 过! Posted by:969869102 at 2011-04-17 17:47:44 #include<iostream>
#include<cstring>
#define DEST 46233 //The sequence num of "123456780",the destination
using namespace std;
struct Result{
char status[10];
short xPos; //Current position of x
char move[100]; //record the current searching record! Important
}eight[50000] = {0},*p = eight,*q = eight + 1;
char final[100] = {0};
static bool used[362881] = {false}; //to mark if the status has been searched
int count = 1;
int SequenceNum(const Result* m){
int big[9] = {0},sum = 0;
for(int i = 0;i < 8;++i){
for(int j = i + 1;j < 9;++j){
if(m->status[i] > m->status[j])++big[8-i];
}
}
int fac = 1;
for(int i = 1;i < 9;++i){
sum += big[i] * fac;
fac *= i + 1;
}
return sum;
}
int BFS(){
int StatusNum,step,pos;
char temp;
while(true){
pos = p->xPos;
step = strlen(p->move);
if(p->xPos > 2){
strcpy(q->status,p->status);
temp = q->status[pos];
q->status[pos] = q->status[pos - 3];
q->status[pos - 3] = temp;
q->xPos = pos - 3;
StatusNum = SequenceNum(q);
if(used[StatusNum] == false){
used[StatusNum] = true;
strcpy(q->move,p->move);
q->move[step] = 'u';
if(StatusNum == DEST){
strcpy(final,q->move);
return step + 1;
}
if(q < eight + 49999)++q;
else q = eight;
++count;
}
}
if(p->xPos < 6){
strcpy(q->status,p->status);
temp = q->status[pos];
q->status[pos] = q->status[pos + 3];
q->status[pos + 3] = temp;
q->xPos = pos + 3;
StatusNum = SequenceNum(q);
if(used[StatusNum] == false){
used[StatusNum] = true;
strcpy(q->move,p->move);
q->move[step] = 'd';
if(StatusNum == DEST){
strcpy(final,q->move);
return step + 1;
}
if(q < eight + 49999)++q;
else q = eight;
++count;
}
}
if(p->xPos%3 > 0){
strcpy(q->status,p->status);
temp = q->status[pos];
q->status[pos] = q->status[pos - 1];
q->status[pos - 1] = temp;
q->xPos = pos - 1;
StatusNum = SequenceNum(q);
if(used[StatusNum] == false){
used[StatusNum] = true;
strcpy(q->move,p->move);
q->move[step] = 'l';
if(StatusNum == DEST){
strcpy(final,q->move);
return step + 1;
}
if(q < eight + 49999)++q;
else q = eight;
++count;
}
}
if(p->xPos%3 < 2){
strcpy(q->status,p->status);
temp = q->status[pos];
q->status[pos] = q->status[pos + 1];
q->status[pos + 1] = temp;
q->xPos = pos + 1;
StatusNum = SequenceNum(q);
if(used[StatusNum] == false){
used[StatusNum] = true;
strcpy(q->move,p->move);
q->move[step] = 'r';
if(StatusNum == DEST){
strcpy(final,q->move);
return step + 1;
}
if(q < eight + 49999)++q;
else q = eight;
++count;
}
}
//Final: Process p
if(p < eight + 49999)++p;
else p = eight;
--count;
}
}
int main(){
/* Get the original board */
for(int i = 0;i < 9;++i){
cin>>p->status[i];
if(p->status[i] == 'x'){
p->status[i] = '0';
p->xPos = i;
}
}
if(strcmp(p->status,"123456780") == 0){
printf("0\n");
return 0;
}
used[SequenceNum(p)] = true;
memset(p->move,0,100*sizeof(char));
/* Search and print result */
BFS();
printf("%s\n",final);
return 0;
}
329ms
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator