• 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 }
  • 相关阅读:
    7-2 一元多项式的乘法与加法运算 (20 分)
    cvc-complex-type.2.4.a: Invalid content was found starting with element(servlet)
    MOOC 2.3 队列
    MOOC 2.2 堆栈
    MOOC 2.1 线性表及其实现
    MOOC 1.3 最大子列和
    计时程序
    MOOC 1.1 什么是数据结构
    poj3253
    二分法查找——对数
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/5350864.html
Copyright © 2020-2023  润新知