[題目傳送] http://djks.nbut.edu.cn:8090/JudgeOnline/problem.php?id=1065php
[思路] 大概意思就是轉來轉去,問你一個本來的矩陣能轉成什麼不一樣的東西,每種操做數最多2,4個操做數,頂多8個操做,咱們枚舉全部操做,而後按照進行操做,最後比較一下之前有沒有和它同樣的就行。一些編程技巧注意:ios
1.不要用全排列的庫函數,排列會重複,浪費了一些狀況,這題dfs並非很難寫,手寫全排列比較靠譜。編程
2.判斷一個3*3的矩陣是否相等,很難,咱們能夠用一個數字表示一個矩陣,好比題目中的能夠表示爲整數123456789.less
3.判斷重複狀況能夠使用map或者set庫,你要做死本身寫判重,也能夠。函數
[代碼]spa
1 #include <iostream> 2 #include <string> 3 #include <set> 4 #include <cstdio> 5 6 using namespace std; 7 int _left[] = {2,5,8,1,4,7,0,3,6}; 8 int _right[] = {6,3,0,7,4,1,8,5,2}; 9 int _rtl[] = {2,1,0,5,4,3,8,7,6}; 10 int _utd[] = {6,7,8,3,4,5,0,1,2}; 11 int op[4]; 12 set<int,less<int> > SS; 13 14 int trans(const char * arr){ 15 int ans = 0; 16 int quan = 1; 17 for(int i = 8 ; i >= 0 ; i--){ 18 ans += (arr[i] - '0') * quan; 19 quan *= 10; 20 } 21 return ans; 22 } 23 void check(const char * arr){ 24 cout << arr[0] << arr[1] << arr[2] << endl; 25 cout << arr[3] << arr[4] << arr[5] << endl; 26 cout << arr[6] << arr[7] << arr[8] << endl; 27 return ; 28 } 29 void op_left(char * arr){ 30 char temp[10]; 31 for(int i = 0 ; i < 9 ; i++) temp[i] = arr[i]; 32 for(int i = 0 ; i < 9 ; i++) arr[i] = temp[_left[i]]; 33 return ; 34 } 35 36 void op_right(char * arr){ 37 char temp[10]; 38 for(int i = 0 ; i < 9 ; i++) temp[i] = arr[i]; 39 for(int i = 0 ; i < 9 ; i++) arr[i] = temp[_right[i]]; 40 return ; 41 } 42 43 void op_rtl(char * arr){ 44 char temp[10]; 45 for(int i = 0 ; i < 9 ; i++) temp[i] = arr[i]; 46 for(int i = 0 ; i < 9 ; i++) arr[i] = temp[_rtl[i]]; 47 return ; 48 } 49 50 void op_utd(char * arr){ 51 char temp[10]; 52 for(int i = 0 ; i < 9 ; i++) temp[i] = arr[i]; 53 for(int i = 0 ; i < 9 ; i++) arr[i] = temp[_utd[i]]; 54 return ; 55 } 56 57 void dfs(char * arr){ 58 if(!op[0] && !op[1] && !op[2] && !op[3]){ 59 int temp = trans(arr); 60 if(SS.find(temp) == SS.end()) SS.insert(temp); 61 return ; 62 } 63 if(op[0] != 0){ 64 op[0]--; 65 op_left(arr); 66 dfs(arr); 67 op_right(arr); 68 op[0]++; 69 } 70 if(op[1] != 0){ 71 op[1]--; 72 op_right(arr); 73 dfs(arr); 74 op_left(arr); 75 op[1]++; 76 } 77 if(op[2] != 0){ 78 op[2]--; 79 op_rtl(arr); 80 dfs(arr); 81 op_rtl(arr); 82 op[2]++; 83 } 84 if(op[3] != 0){ 85 op[3]--; 86 op_utd(arr); 87 dfs(arr); 88 op_utd(arr); 89 op[3]++; 90 } 91 return ; 92 } 93 94 95 int main(){ 96 int T; 97 while(~scanf("%d",&T)) while(T--){ 98 SS.clear(); 99 char a[10]; 100 scanf("%s",a); 101 scanf("%d %d %d %d",&op[0],&op[1],&op[2],&op[3]); 102 //// 103 dfs(a); 104 int ans = SS.size(); 105 printf("%d\n", ans); 106 } 107 return 0; 108 }