Advertisement
rainman002

TicTacToe 3x3x3 possible draws

Apr 19th, 2013
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.90 KB | None | 0 0
  1. #include<string.h>
  2. #include<stdio.h>
  3.  
  4. const int m = 48;
  5. int draws[48][9];
  6.  
  7. int board[27] = {0};
  8.  
  9. void invert(int* dst , int* src)
  10. {
  11.     int i;
  12.     for(i=0 ; i<9 ; i++)
  13.         dst[i] = 1-src[i];
  14. }
  15.  
  16. void rot180(int* dst , int* src)
  17. {
  18.     int i;
  19.     for(i=0 ; i<9 ; i++)
  20.         dst[i] = src[8-i];
  21. }
  22.  
  23. void transpose2d(int* dst , int* src)
  24. {
  25.     int i;
  26.     for(i=0 ; i<9 ; i++)
  27.         dst[i] = src[i/3 + (i%3)*3];
  28. }
  29.  
  30. void mirror2d(int* dst , int* src)
  31. {
  32.     int i;
  33.     for(i=0 ; i<9 ; i++)
  34.         dst[i] = src[i+2-2*(i%3)];
  35. }
  36.  
  37. int isDraw()
  38. {
  39.     int draw = 1;
  40.     int i;
  41.    
  42.     for(i=0 ; i<9 ; i++)
  43.         draw = draw && (board[i] + board[i+9] + board[i+18])%3;
  44.    
  45.     for(i=0 ; i<3 ; i++)
  46.         draw = draw && (board[i] + board[i+12] + board[i+24])%3 && (board[i+6] + board[i+12] + board[i+18])%3;
  47.  
  48.     for(i=0 ; i<9 ; i+=3)
  49.         draw = draw && (board[i] + board[i+10] + board[i+20])%3 && (board[i+2] + board[i+10] + board[i+18])%3;
  50.    
  51.     for(i=-4 ; i<=4 ; i+=2)
  52.         draw = draw && (board[i+4] + board[13] + board[-i+22])%3;
  53.            
  54.     return draw;
  55. }
  56.  
  57. void main()
  58. {
  59.     int i,j,k;
  60.     int no = 0 , yes = 0;
  61.    
  62.     int draw0[] = {1,0,0,0,1,1,0,1,0};
  63.     int draw1[] = {1,0,1,0,1,0,0,1,0};
  64.     int draw2[] = {1,0,0,0,1,1,1,1,0};
  65.     memcpy( &draws[0] , &draw0 , 9*sizeof(int) );
  66.     memcpy( &draws[1] , &draw1 , 9*sizeof(int) );
  67.     memcpy( &draws[2] , &draw2 , 9*sizeof(int) );
  68.    
  69.     for(i=3 ; i<6 ; i++)
  70.         rot180(draws[i] , draws[i-3]);
  71.     for(i=6 ; i<12 ; i++)
  72.         transpose2d(draws[i] , draws[i-6]);
  73.     for(i=12 ; i<24 ; i++)
  74.         mirror2d(draws[i] , draws[i-12]);
  75.     for(i=24 ; i<48 ; i++)
  76.         invert(draws[i] , draws[i-24]);
  77.    
  78.     for(i=0 ; i<m ; i++)
  79.     {
  80.         memcpy( &board[0] , &draws[i] , 9*sizeof(int) );
  81.         for(j=0 ; j<m ; j++)
  82.         {
  83.             memcpy( &board[9] , &draws[j] , 9*sizeof(int) );
  84.             for(k=0 ; k<m ; k++)
  85.             {
  86.                 memcpy( &board[18] , &draws[k] , 9*sizeof(int) );
  87.                 if(isDraw())
  88.                     yes ++;
  89.                 else
  90.                     no ++;
  91.             }
  92.         }
  93.     }
  94.     printf("draws: %d    without draw: %d\n",yes,no);
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement