[题目传送] http://djks.nbut.edu.cn:8090/JudgeOnline/problem.php?id=1065
[思路] 大概意思就是转来转去,问你一个原本的矩阵能转成什么不同的东西,每种操作数最多2,4个操作数,顶多8个操作,我们枚举所有操作,然后按照进行操作,最后比较一下以前有没有和它一样的就行。一些编程技巧注意:
1.不要用全排列的库函数,排列会重复,浪费了一些情况,这题dfs并不是很难写,手写全排列比较靠谱。
2.判断一个3*3的矩阵是否相等,很难,我们可以用一个数字表示一个矩阵,比如题目中的可以表示为整数123456789.
3.判断重复情况可以使用map或者set库,你要作死自己写判重,也可以。
[代码]
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 }
时间: 2024-09-08 06:05:03