hdu 5386 模拟

想明白以后会发现其实就是模拟...

因为每次只能给一整行或者一整列赋值,所以目标矩阵一开始一定有一行或者一列上数字都是相同的,然后找到对应的操作,把那一行或者那一列标记为访问过。然后新的矩阵也一定能找到一行或者一列数字都相同,再找到相应的操作,标记那一行或者那一列,依次类推,然后没有用到的操作随便找个顺序就好了。其实初始矩阵并没有什么用......

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5
  6 const int N = 101;
  7 const int M = 501;
  8 int mp1[N][N];
  9 int mp2[N][N];
 10 int goal[N][N];
 11 bool visit[N][N];
 12 bool used[M];
 13 int ans[M];
 14 int n, m, cnt;
 15
 16 struct Node
 17 {
 18     char op[2];
 19     int x, y;
 20 } node[M];
 21
 22 int checkRow( int row )
 23 {
 24     int j = 1;
 25     while ( j <= n && visit[row][j] ) j++;
 26     if ( j == n + 1 ) return -1;
 27     int num = goal[row][j];
 28     for ( int k = j + 1; k <= n; k++ )
 29     {
 30         if ( visit[row][k] ) continue;
 31         if ( num != goal[row][k] ) return -1;
 32     }
 33     return num;
 34 }
 35
 36 int checkCol( int col )
 37 {
 38     int i = 1;
 39     while ( i <= n && visit[i][col] ) i++;
 40     if ( i == n + 1 ) return -1;
 41     int num = goal[i][col];
 42     for ( int k = i + 1; k <= n; k++ )
 43     {
 44         if ( visit[k][col] ) continue;
 45         if ( num != goal[k][col] ) return -1;
 46     }
 47     return num;
 48 }
 49
 50 void solve()
 51 {
 52     memset( visit, 0, sizeof(visit) );
 53     memset( used, 0, sizeof(used) );
 54     cnt = 1;
 55     while ( 1 )
 56     {
 57         bool flag = false;
 58         for ( int row = 1; row <= n; row++ )
 59         {
 60             int tmp = checkRow(row);
 61             if ( tmp != -1 && mp1[row][tmp] != -1 )
 62             {
 63                 ans[cnt++] = mp1[row][tmp];
 64                 used[mp1[row][tmp]] = true;
 65                 for ( int k = 1; k <= n; k++ )
 66                 {
 67                     visit[row][k] = 1;
 68                 }
 69                 flag = true;
 70             }
 71         }
 72         for ( int col = 1; col <= n; col++ )
 73         {
 74             int tmp = checkCol(col);
 75             if ( tmp != -1 && mp2[col][tmp] != -1 )
 76             {
 77                 ans[cnt++] = mp2[col][tmp];
 78                 used[mp2[col][tmp]] = true;
 79                 for ( int k = 1; k <= n; k++ )
 80                 {
 81                     visit[k][col] = 1;
 82                 }
 83                 flag = true;
 84             }
 85         }
 86         if ( !flag ) break;
 87     }
 88     for ( int i = 1; i <= m; i++ )
 89     {
 90         if ( !used[i] )
 91         {
 92             ans[cnt++] = i;
 93         }
 94     }
 95     for ( int i = m; i > 1; i-- )
 96     {
 97         printf("%d ", ans[i]);
 98     }
 99     printf("%d\n", ans[1]);
100 }
101
102 int main()
103 {
104     int t;
105     scanf("%d", &t);
106     while ( t-- )
107     {
108         scanf("%d%d", &n, &m);
109         for ( int i = 1; i <= n; i++ )
110         {
111             for ( int j = 1; j <= n; j++ )
112             {
113                 scanf("%d", &goal[i][j]);
114             }
115         }
116         for ( int i = 1; i <= n; i++ )
117         {
118             for ( int j = 1; j <= n; j++ )
119             {
120                 scanf("%d", &goal[i][j]);
121             }
122         }
123         memset( mp1, -1, sizeof(mp1) );
124         memset( mp2, -1, sizeof(mp2) );
125         for ( int i = 1; i <= m; i++ )
126         {
127             scanf("%s %d %d", &node[i].op, &node[i].x, &node[i].y);
128             if ( node[i].op[0] == ‘H‘ )
129             {
130                 mp1[node[i].x][node[i].y] = i;
131             }
132             else
133             {
134                 mp2[node[i].x][node[i].y] = i;
135             }
136         }
137         solve();
138     }
139     return 0;
140 }
时间: 2024-08-08 22:33:03

hdu 5386 模拟的相关文章

HDU 4930 模拟

Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 266    Accepted Submission(s): 87 Problem Description Fighting the Landlords is a card game which has been a heat for yea

HDU 5386 Cover(模拟)

Cover Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 966    Accepted Submission(s): 320 Special Judge Problem Description You have an n?n matrix.Every grid has a color.Now there are two types

HDU 5386 Cover (MUT #8 模拟暴力)

[题目链接]:click here~~ [题意]: 操作L x y,把当前x,这一列全部置为y 操作H x y,把当前,这一行全部置为y. 现在给你n?n的初始矩阵,以及n?n的目标矩阵 现在给你m种操作(由以上两种操作构成),问怎么排序这m种操作,才能使得,初始矩阵,经由排序后的操作,构成目标矩阵. 输出排序方案. 也就是给出初始矩阵和目标矩阵,存在m中操作,可以分别把每行或者每列都涂成同一种颜色,数据保证有解,因为保证有解,(然而初始矩阵并没有什么卵用...) [思路]: 暴力寻找M次操作,

HDU 5386 Cover

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 题目大意:给一个初始矩阵(n×n).一个目标矩阵(n×n)和m个操作,要求找到一种操作顺序,使初始矩阵变成目标矩阵.操作共有两种,如下: L x y: 把当前矩阵第x列的数全变为y H x y: 把当前矩阵第x行的数全变为y 输入格式:先输入case数T,每个case第一行是两个整数n和m,接下来n行输入初始矩阵,再下来n行输入目标矩阵.最后m行输入操作. 1≤color[i][j]≤n,co

hdu 1022 模拟栈

其实就是模拟一下栈啦. 1 #include <iostream> 2 using namespace std; 3 4 const int N = 10; 5 char o1[N]; 6 char o2[N]; 7 char s[N]; 8 int ans[N * 2]; 9 10 int main () 11 { 12 int n; 13 while ( cin >> n ) 14 { 15 cin >> o1 >> o2; 16 int top = 0

hdu 4054 模拟 练习十六进制输出

http://acm.hdu.edu.cn/showproblem.php?pid=4054 貌似一般区域赛都会有一道水题 这道题PE了一次  因为输出每个数其实是两个位 如果用空格补齐的话  应该用两个空格 我用了一个空格,,, 学到: 1.%x  十六进制输出  可以输出整型,字符型等等 2.%02x  保证两位 而且会输出先导0的两位 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstd

hdu 5246(模拟)

题解:直接模拟 #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 10005; long long n, m, k; long long s[N]; int main() { int t, cas = 1; scanf("%d", &t); while (t--) { scanf("%lld%l

HDU 5071 模拟

考察英语的题 - -# 按条件模拟,一遍就行了,每个聊天对象有其价值U,数组模拟队列过程即可,若存在Top标记,则和Top标记的人聊天,否则和队列的第一个人聊天 mark记录队尾,top记录Top操作,data[i].p记录U,data[i].x记录chat数,data[i].y记录该人是否被删除 Add U:在 队尾插入价值为U的人,需要特判U人已经存在 Close U::在整个队列中查找价值为U的人,将其删除,需要特判该人不存在 Chat x:当前聊天页面的人chat+=x,特判当前队列没有

HDU 2860 (模拟+并查集)

Regroup Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1057    Accepted Submission(s): 297 Problem Description When ALPC42 got to a panzer brigade, He was asked to build software to help them r