knightL

Untitled

Jan 24th, 2011
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <map>
  3. #include <queue>
  4. #include <vector>
  5. #define TABLESIZE 100003
  6. #define MOD 11
  7. using namespace std;
  8.  
  9. struct field
  10. {
  11.     char f[9];
  12.     field()
  13.     {
  14.         for(int i=0;i<9;i++)
  15.             f[i]='\0';
  16.     }
  17.     field(char _f[9])
  18.     {
  19.         for(int i=0;i<9;i++)
  20.             f[i]=_f[i];
  21.     }
  22.     bool winning()
  23.     {
  24.         for(int i=0;i<8;i++)
  25.             if(f[i]!=i+'1') return false;
  26.         return true;
  27.     }
  28.     int hash()
  29.     {
  30.         int res=0;
  31.         for(int i=0;i<9;i++)
  32.             res=(res*MOD+f[i]-'0')%TABLESIZE;
  33.         return res;
  34.     }
  35. };
  36.  
  37. bool operator<(const field &a,const field &b)
  38. {
  39.     for(int i=0;i<9;i++)
  40.         if(a.f[i]!=b.f[i])
  41.             return a.f[i]<b.f[i];
  42.     return false;
  43. }
  44.  
  45. bool used[TABLESIZE]={};
  46.  
  47. int main()
  48. {
  49.     freopen("game.dat","rt",stdin);
  50.     freopen("game.sol","wt",stdout);
  51.     vector<vector<int> > adj(9);
  52.     adj[0].push_back(1);
  53.     adj[0].push_back(3);
  54.     adj[1].push_back(0);
  55.     adj[1].push_back(2);
  56.     adj[1].push_back(4);
  57.     adj[2].push_back(1);
  58.     adj[2].push_back(5);
  59.     adj[3].push_back(0);
  60.     adj[3].push_back(4);
  61.     adj[3].push_back(6);
  62.     adj[4].push_back(1);
  63.     adj[4].push_back(3);
  64.     adj[4].push_back(5);
  65.     adj[4].push_back(7);
  66.     adj[5].push_back(2);
  67.     adj[5].push_back(4);
  68.     adj[5].push_back(8);
  69.     adj[6].push_back(7);
  70.     adj[6].push_back(3);
  71.     adj[7].push_back(6);
  72.     adj[7].push_back(2);
  73.     adj[7].push_back(8);
  74.     adj[8].push_back(5);
  75.     adj[8].push_back(5);
  76.     char s[10];
  77.     field cur;
  78.     int i,d,zpos;
  79.     for(i=0;i<3;i++)
  80.         scanf("%s",&s[3*i]);
  81.     queue<pair<field,int> > q;
  82.     cur=field(s);
  83.     q.push(make_pair(cur,0));
  84.     used[cur.hash()]=true;
  85.     while(!q.empty())
  86.     {
  87.         d=q.front().second;
  88.         cur=q.front().first;
  89.         q.pop();
  90.         if(cur.winning())
  91.         {
  92.             printf("%d\n",d);
  93.             return 0;
  94.         }
  95.         for(i=0;i<9;i++)
  96.             if(cur.f[i]=='0') break;
  97.         zpos=i;
  98.         for(i=0;i<adj[zpos].size();i++)
  99.         {
  100.             swap(cur.f[zpos],cur.f[adj[zpos][i]]);
  101.             if(!used[cur.hash()])
  102.             {
  103.                 used[cur.hash()]=true;
  104.                 q.push(make_pair(cur,d+1));
  105.             }
  106.             swap(cur.f[zpos],cur.f[adj[zpos][i]]);
  107.         }
  108.     }
  109.     printf("%d\n",-1);
  110. }
Add Comment
Please, Sign In to add comment