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\n", ans);
106     }
107     return 0;
108 }
时间: 2024-09-08 06:05:03

1065 Operations On Grids的相关文章

kuangbin OJ 1217-- Operations on Grids(YY)(好题)

1217: Operations on Grids Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 89  Solved: 20 [Submit][Status][Web Board] Description 你有一个 9 位数字串,现在你把这个数字的每一位填到 3 × 3 格子上.如果数 字是 123456789,那么填到 3 × 3 格子上会得到: 123 456 789 现在你可以对这 3 × 3 格子做四种操作: 现在给你这个 9 位数字串

POJ 1065. Wooden Sticks 贪心 结构体排序

Wooden Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19992   Accepted: 8431 Description There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworkin

backup, file manipulation operations (such as ALTER DATABASE ADD FILE) and encryption changes on a database must be serialized.

昨天在检查YourSQLDba备份时,发现有台数据库做备份时出现了下面错误信息,如下所示: <Exec>   <ctx>yMaint.ShrinkLog</ctx>   <inf>Log Shrink</inf>   <Sql> --  ======================================================================== -- Shrink of log file E:\SQ

CRUD Operations In ASP.NET MVC 5 Using ADO.NET

Background After awesome response of an published by me in the year 2013: Insert, Update, Delete In GridView Using ASP.Net C#. It now has more than 140 K views, therefore to help beginners I decided to rewrite the article i with stepbystep approach u

hdu 4828 Grids(拓展欧几里得+卡特兰数)

题目链接:hdu 4828 Grids 题目大意:略. 解题思路:将上一行看成是入栈,下一行看成是出栈,那么执着的方案就是卡特兰数,用递推的方式求解. #include <cstdio> #include <cstring> typedef long long ll; const int N = 1000005; const ll MOD = 1e9+7; ll dp[N]; ll extendGcd(ll a, ll b, ll& x, ll& y) { if (

PAT乙级 1065. 单身狗(25) by Python

1065. 单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数:随后N行,每行给出一对夫妻/伴侣--为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔:之后给出一

1065 最小正子段和 二分答案 + 判定

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 我的思路比较笨,我是直接二分那个答案mid 然后进行一次O(nlogn)的判定,如果能找到一个区间的和比mid小的,(当然这个区间的和也是要大于0),那就return true 进行判断如下: 处理出前缀和dp[i],对于每一个i 目标是:在前i - 1个中,查看是否有这样的一个x,使得,dp[i] - x    <=   mid,&& dp[i] -

网络流(最大流):CodeForces 499E Array and Operations

You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m good pairs of integers (i1, j1), (i2, j2), ..., (im, jm). Each good pair (ik, jk) meets the following conditions: ik + jk is an odd number and 1 ≤ ik < j

深度优先搜索 codevs 1065 01字符串

codevs 1065 01字符串 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输出仅有0和1组成的长度为n的字符串,并且其中不能含有3个连续的相同子串. 输入描述 Input Description 输入文件只有一行一个整数n,表示有0和1组成的字符串的长度.0<=n<=30. 输出描述 Output Description 输出文件只有一行一个整数,表示所有满足条件的字符串的个数. 样例输入 Sample Input