zoukankan      html  css  js  c++  java
  • 八数码问题

    单向和双向bfs

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<ctime>
     7 #include<set>
     8 #include<map>
     9 #include<stack>
    10 #include<cstring>
    11 #define inf 2147483647
    12 #define ls rt<<1
    13 #define rs rt<<1|1
    14 #define lson ls,nl,mid,l,r
    15 #define rson rs,mid+1,nr,l,r
    16 #define N 100010
    17 #define For(i,a,b) for(register int i=a;i<=b;i++)
    18 #define p(a) putchar(a)
    19 #define g() getchar()
    20 
    21 using namespace std;
    22 int n,temp;
    23 int dx[]={-1,1,0,0};
    24 int dy[]={0,0,-1,1};
    25 int a[10][10];
    26 map<int,int>m;
    27 queue<int>q;
    28 int t,x,y,nx,ny;
    29 void in(int &x){
    30     int y=1;
    31     char c=g();x=0;
    32     while(c<'0'||c>'9'){
    33         if(c=='-')y=-1;
    34         c=g();
    35     }
    36     while(c<='9'&&c>='0'){
    37         x=(x<<1)+(x<<3)+c-'0';c=g();
    38     }
    39     x*=y;
    40 }
    41 void o(int x){
    42     if(x<0){
    43         p('-');
    44         x=-x;
    45     }
    46     if(x>9)o(x/10);
    47     p(x%10+'0');
    48 }
    49 
    50 inline void Turn(int n){
    51     for(register int i=3;i;i--)
    52         for(register int j=3;j;j--){
    53             a[i][j]=n%10;
    54             n/=10;
    55             if(!a[i][j]){
    56                 x=i;
    57                 y=j;
    58             }
    59         }
    60 }
    61 
    62 int main(){
    63     in(n);
    64     q.push(n);
    65     while(!q.empty()){
    66         t=q.front();q.pop();
    67         if(t==123804765)
    68             break;
    69         Turn(t);
    70         For(I,0,3){
    71             nx=x+dx[I];
    72             ny=y+dy[I];
    73             if(nx>3||ny>3||nx<1||ny<1) continue;
    74             swap(a[nx][ny],a[x][y]);
    75             temp=0;
    76             For(i,1,3)
    77                 For(j,1,3){
    78                     temp*=10;
    79                     temp+=a[i][j];
    80                 }
    81             if(!m.count(temp)){
    82                 m[temp]=m[t]+1;
    83                 q.push(temp);
    84             }
    85             swap(a[nx][ny],a[x][y]);
    86         }
    87     }
    88     o(m[123804765]);
    89     return 0;
    90 }
    View Code
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #include<map>
      9 #include<stack>
     10 #include<cstring>
     11 #define inf 2147483647
     12 #define ls rt<<1
     13 #define rs rt<<1|1
     14 #define lson ls,nl,mid,l,r
     15 #define rson rs,mid+1,nr,l,r
     16 #define N 123804765
     17 #define For(i,a,b) for(int i=a;i<=b;i++)
     18 #define p(a) putchar(a)
     19 #define g() getchar()
     20 
     21 using namespace std;
     22 int n,temp;
     23 int dx[]={-1,1,0,0};
     24 int dy[]={0,0,-1,1};
     25 int a[10][10];
     26 map<int,int>m,d;
     27 
     28 queue<int>q;
     29 int t,x,y,nx,ny;
     30 void in(int &x){
     31     int y=1;
     32     char c=g();x=0;
     33     while(c<'0'||c>'9'){
     34         if(c=='-')y=-1;
     35         c=g();
     36     }
     37     while(c<='9'&&c>='0'){
     38         x=(x<<1)+(x<<3)+c-'0';c=g();
     39     }
     40     x*=y;
     41 }
     42 void o(int x){
     43     if(x<0){
     44         p('-');
     45         x=-x;
     46     }
     47     if(x>9)o(x/10);
     48     p(x%10+'0');
     49 }
     50 
     51 inline void Turn(int n){
     52     for(int i=3;i;i--)
     53         for(int j=3;j;j--){
     54             a[i][j]=n%10;
     55             n/=10;
     56             if(!a[i][j]){
     57                 x=i;
     58                 y=j;
     59             }
     60         }
     61 }
     62 
     63 int main(){
     64     in(n);
     65     if(n==N){
     66         o(0);
     67         return 0;
     68     }
     69     q.push(n);
     70     q.push(N);
     71     m[N]=1;
     72     d[n]=1;
     73     d[N]=2;
     74     while(!q.empty()){
     75         t=q.front();q.pop();
     76         Turn(t);
     77         For(I,0,3){
     78             nx=x+dx[I];
     79             ny=y+dy[I];
     80             if(nx>3||ny>3||nx<1||ny<1) continue;
     81             swap(a[nx][ny],a[x][y]);
     82             temp=0;
     83             For(i,1,3)
     84                 For(j,1,3){
     85                     temp*=10;
     86                     temp+=a[i][j];
     87                 }
     88             if(d[temp]==d[t]){
     89                 swap(a[nx][ny],a[x][y]);
     90                 continue;
     91             }
     92             if(d[temp]+d[t]==3){
     93                 o(m[temp]+m[t]);
     94                 return 0;
     95             }
     96             d[temp]=d[t];
     97             m[temp]=m[t]+1;
     98             q.push(temp);
     99             swap(a[nx][ny],a[x][y]);
    100         }
    101     }
    102     return 0;
    103 }
    View Code
  • 相关阅读:
    sqlnet设置网络传输加密
    临时表处理办法
    分布式事务2PC_PENDING异常处理
    统计信息收集百分比和并行改变
    dataguard丢失归档日志处理
    patch 28729262
    Cardinality
    统计信息不准导致sql性能下降
    子查询展开
    ogg 单表拆分合并进程
  • 原文地址:https://www.cnblogs.com/war1111/p/10513560.html
Copyright © 2011-2022 走看看