Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <map>
- #include <queue>
- #include <vector>
- #define TABLESIZE 100003
- #define MOD 11
- using namespace std;
- struct field
- {
- char f[9];
- field()
- {
- for(int i=0;i<9;i++)
- f[i]='\0';
- }
- field(char _f[9])
- {
- for(int i=0;i<9;i++)
- f[i]=_f[i];
- }
- bool winning()
- {
- for(int i=0;i<8;i++)
- if(f[i]!=i+'1') return false;
- return true;
- }
- int hash()
- {
- int res=0;
- for(int i=0;i<9;i++)
- res=(res*MOD+f[i]-'0')%TABLESIZE;
- return res;
- }
- };
- bool operator<(const field &a,const field &b)
- {
- for(int i=0;i<9;i++)
- if(a.f[i]!=b.f[i])
- return a.f[i]<b.f[i];
- return false;
- }
- bool used[TABLESIZE]={};
- int main()
- {
- freopen("game.dat","rt",stdin);
- freopen("game.sol","wt",stdout);
- vector<vector<int> > adj(9);
- adj[0].push_back(1);
- adj[0].push_back(3);
- adj[1].push_back(0);
- adj[1].push_back(2);
- adj[1].push_back(4);
- adj[2].push_back(1);
- adj[2].push_back(5);
- adj[3].push_back(0);
- adj[3].push_back(4);
- adj[3].push_back(6);
- adj[4].push_back(1);
- adj[4].push_back(3);
- adj[4].push_back(5);
- adj[4].push_back(7);
- adj[5].push_back(2);
- adj[5].push_back(4);
- adj[5].push_back(8);
- adj[6].push_back(7);
- adj[6].push_back(3);
- adj[7].push_back(6);
- adj[7].push_back(2);
- adj[7].push_back(8);
- adj[8].push_back(5);
- adj[8].push_back(5);
- char s[10];
- field cur;
- int i,d,zpos;
- for(i=0;i<3;i++)
- scanf("%s",&s[3*i]);
- queue<pair<field,int> > q;
- cur=field(s);
- q.push(make_pair(cur,0));
- used[cur.hash()]=true;
- while(!q.empty())
- {
- d=q.front().second;
- cur=q.front().first;
- q.pop();
- if(cur.winning())
- {
- printf("%d\n",d);
- return 0;
- }
- for(i=0;i<9;i++)
- if(cur.f[i]=='0') break;
- zpos=i;
- for(i=0;i<adj[zpos].size();i++)
- {
- swap(cur.f[zpos],cur.f[adj[zpos][i]]);
- if(!used[cur.hash()])
- {
- used[cur.hash()]=true;
- q.push(make_pair(cur,d+1));
- }
- swap(cur.f[zpos],cur.f[adj[zpos][i]]);
- }
- }
- printf("%d\n",-1);
- }
Add Comment
Please, Sign In to add comment