1065 Operations On Grids

[题目传送] 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
", ans);
106     }
107     return 0;
108 }
原文地址:https://www.cnblogs.com/ticsmtc/p/5350864.html