fuliver123

Flip five

Aug 6th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3.  
  4. using namespace std;
  5.  
  6. int indexArr(int *arr)
  7. {
  8.     int id=0;
  9.     for (int i=0;i<9;i++)
  10.         if (arr[i]==1)
  11.         {
  12.             id+=(1<<(i));
  13.         }
  14.     return id;
  15. }
  16.  
  17. int *ArrIndex(int id)
  18. {
  19.     int *arr = new int[9];
  20.     for (int i=0;i<9;i++)
  21.     {
  22.         arr[i] = id%2;
  23.         id = id/2;
  24.     }
  25.     return arr;
  26. }
  27.  
  28. int d2s(int x, int y)
  29. {
  30.     int du[3] = {3,1,2};
  31.     return (x-1)*3+du[y%3];
  32. }
  33.  
  34. // numMove count on 1;
  35. int *Move(int *arr, int numMove)
  36. {
  37.     int x[10] = {0,1,1,1,2,2,2,3,3,3};
  38.     int y[10] = {0,1,2,3,1,2,3,1,2,3};
  39.     int *arr2 = new int[9];
  40.     for (int i=0; i<9;i++)
  41.         arr2[i]=arr[i];
  42.     arr2[numMove-1] = 1-arr2[numMove-1];
  43.     if (x[numMove]-1>0)
  44.     {
  45.         int tp = d2s(x[numMove]-1,y[numMove]);
  46.         arr2[tp-1] = 1 - arr2[tp-1];
  47.     }
  48.     if (x[numMove]+1<4)
  49.     {
  50.         int tp = d2s(x[numMove]+1,y[numMove]);
  51.         arr2[tp-1] = 1 - arr2[tp-1];
  52.     }
  53.     if (y[numMove]-1>0)
  54.     {
  55.         int tp = d2s(x[numMove],y[numMove]-1);
  56.         arr2[tp-1] = 1 - arr2[tp-1];
  57.     }
  58.     if (y[numMove]+1<4)
  59.     {
  60.         int tp = d2s(x[numMove],y[numMove]+1);
  61.         arr2[tp-1] = 1 - arr2[tp-1];
  62.     }
  63.     return arr2;
  64. }
  65.  
  66. int BFS(int *arr)
  67. {
  68.     int mark[513]={};
  69.     int queue[513]={};
  70.     int depth[513]={};
  71.     int id = indexArr(arr);
  72.     if (id==0)
  73.         return 0;
  74.     queue[0]= id;
  75.     depth[0]= 0;
  76.     mark[id]=1;
  77.     int start=0, end=1;
  78.     while (start<end)
  79.     {
  80.         int *arr2 = ArrIndex(queue[start]);
  81.         for (int i=1;i<=9;i++)
  82.         {
  83.             int newID = indexArr(Move(arr2,i));
  84.             if (newID==0)
  85.             {
  86.                 return depth[start]+1;
  87.             }
  88.             if (mark[newID]==0)
  89.             {
  90.                 queue[end]=newID;
  91.                 depth[end]=depth[start]+1;
  92.                 mark[newID]=1;
  93.                 end++;
  94.             }          
  95.         }
  96.         delete(arr2);
  97.         start++;
  98.     }
  99. }
  100.  
  101. void FlipFive()
  102. {
  103.     int arr[9]={};
  104.    
  105.     for (int i=0;i<9;i++)
  106.     {
  107.         char c = getchar();
  108.         if (c=='*')
  109.             arr[i]=1;
  110.         else if (c=='\n')
  111.         {
  112.             i--;
  113.         }
  114.     }
  115.     cout << BFS(arr);
  116. }
  117.  
  118. int main()
  119. {
  120.     int n;
  121.     cin >> n;
  122.     char c = getchar();
  123.     for (int i=0;i<n;i++)
  124.     {
  125.         FlipFive();
  126.     }
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment