| ||||||||||
| 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:双向搜索0MS YESIn Reply To:双向搜索0MS YES Posted by:pannap at 2014-12-01 13:12:44 > #include <iostream>
> #include <cstring>
> #define N 362881
> using namespace std;
> int state[N];//为1时正向到达,-1为逆向到达
> int v[9], step[N];
> const int fact[9] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};
> const int move[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
> struct node
> {
> int num;
> int pre;
> int predir;
> int nextdir;
> int next;
> }q[N];
> int fabs(int a)
> {
> if(a<0)
> return -a;
> return a;
> }
>
> int canto()//康托展开后面的数全排列
> {
> int j, i, tmp;
> int ans;
> for (ans = 1, i = 0; i < 9; i++)
> {
> for (tmp = v[i] - 1, j = 0; j < i; j++)
> tmp -= (v[j] < v[i]);
> ans = ans + tmp * fact[8 - i];
> }
> return ans;
> }
>
>
>
> void toArray(int num)
> {
> int i = 8;
> while (num)
> {
> v[i--] = num % 10;
> num /= 10;
> }
> }
>
> int toNum()//将数组换算为数字
> {
> int i;
> int ans = 0;
> for (i = 0; i < 9; i++)
> ans =ans*10 + v[i];
> return ans;
> }
>
> int BFS()
> {
> memset(state, false, sizeof(state));
> int head, tail, val;
> int xx, xy, i, tx, ty, tmp, pos1, pos2;
>
> head = tail = 1;
> node p;//开始的状态
> p.num = toNum();
> p.pre = -1;//没有开始值设为-1
> p.next=0;//0代表没有意义
> p.predir = -1;
> p.nextdir=0;//0代表无意义
> val = canto();
> state[val] =1;
> if(123456789==p.num)
> return -2;
>
>
> node last;//最后的状态
> last.num=123456789;
> last.next=-1;
> last.pre=0;//0代表无意义
> last.predir=0;//0代表无意义
> last.nextdir=-1;
> q[tail++] = p;
> q[tail++]=last;
> state[1] =-2;
> while (head < tail)//队列非空
> {
>
> p = q[head]; //取出头指针
> // printf("%d\n",p.num);
> toArray(p.num);
> val = canto();
> for (i = 0; i < 9; i++)//找到x的位置
> if (v[i] == 9) break;
> xy = i / 3;
> xx = i % 3;
> //move
> tx = xx;
> ty = xy;
> for (i = 0; i < 4; i++)
> {
> tx += move[i][0];
> ty += move[i][1];
>
> if (tx >= 0 && tx < 3 && ty >= 0 && ty < 3)
> {
> pos1 = tx + ty * 3;
> pos2 = xx + xy * 3;
> //将值交换
> tmp = v[pos1];
> v[pos1] = v[pos2];
> v[pos2] = tmp;
>
> val = canto();//计算新值
>
>
>
> if (0==q[head].pre&&0==state[val])//head点逆向到达且没有标记过
> {
> state[val] =-tail;//标记为逆向到达
> p.num = toNum();
> p.pre =0;
> p.predir =0;
> p.next=head;
> p.nextdir=i;
> q[tail++] = p;
> }
> else if(0==q[head].pre&&state[val]>0)//逆向已到达过
> {
> q[fabs(state[val])].next=head;
> q[fabs(state[val])].nextdir=i;
> return fabs(state[val]);
> }
>
> else if (0==q[head].next&&0==state[val])//head点正向到达没有标记过
> {
> state[val] = tail;//标记为以到达过
> p.num = toNum();
> p.pre =head;
> p.predir =i;
> p.next=0;
> p.nextdir=0;
> q[tail++] = p;
> }
> else if(0==q[head].next&&state[val]<0)//head点正向到达新点逆向已到达过
> {
> q[fabs(state[val])].pre=head;
> q[fabs(state[val])].predir=i;
> return fabs(state[val]);
> }
> // printf("p.num=%d p.pre=%d p.pre=%d p.predir=%d p.nextdir=%d\n",p.num,p.pre,p.predir ,p.next, p.nextdir);
>
>
> tmp = v[pos2];//恢复未移动时的数据
> v[pos2] = v[pos1];
> v[pos1] = tmp;
> }
> tx = xx;
> ty = xy;
> }
>
> head++;
> }
>
> return -1;
> }
>
> void print(int i)
> {
> int pos = 0;
> int tempi=i;
> // printf("i=%d\n",i);
> // printf("p.num=%d p.pre=%d p.pre=%d p.predir=%d p.nextdir=%d\n",q[i].num,q[i].pre,q[i].predir ,q[i].next, q[i].nextdir);
> while (q[i].pre != -1)
> {
> step[pos++] = q[i].predir;
> i = q[i].pre;
> }
>
> for (i = pos - 1; i >= 0; i--)
> {
> switch (step[i])
> {
> case 0:
> cout << 'r';
> break;
> case 1:
> cout << 'd';
> break;
> case 2:
> cout << 'l';
> break;
> case 3:
> cout << 'u';
> break;
> }
> }
>
>
> i=tempi;
> while (q[i].next != -1)
> {
> if(0==q[i].nextdir)
> cout << 'l';
> else if(1==q[i].nextdir)
> cout << 'u';
> else if(2==q[i].nextdir)
> cout << 'r';
> else if(3==q[i].nextdir)
> cout << 'd';
>
> i = q[i].next;
> }
>
> cout<<endl;
> }
> int main()
> {
> int i;
> int tmp;
> char c;
> for (i = 0; i < 9; i++)
> {
> cin >> c;
> if (c == 'x') v[i] = 9;
> else v[i] = c - '0';
> }
>
> tmp = BFS();
>
> if (-1==tmp )
> cout << "unsolvable"<<endl;
> else if(-2==tmp)
> cout<<endl;
> else
> print(tmp);
> //system("pause");
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator