HDU 1278 漂亮面料的设计(超级模拟)

2024-03-05 20:58

本文主要是介绍HDU 1278 漂亮面料的设计(超级模拟),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

漂亮面料的设计


http://acm.hdu.edu.cn/showproblem.php?pid=1278

Time Limit: 2000/1000 MS (Java/Others)   

 Memory Limit: 65536/32768 K (Java/Others)



Problem Description
现在的CAD技术已经能够很方便地设计出漂亮的面料,如图(b)所示。图(a)是所对应的组织图,它表示纱线的交织规律,经过分析表明:组织规律可以用一个二维矩阵准确描述出来。

图(a)的描述矩阵为:
0000101111110011000111000110011111101000
0001001111100110000111000011001111100100
0001011111001100001101100001100111110100
0010011110011100001000100001110011110010
0110111100111100011000110001111001111011
1100111001111000110000011000111100111001
1001111011110001110010011100011110111100
0001110111100011100111001110001111011100
0011110111000011000101000110000111011110
0111101110000010001000100010000011101111
1111101100000100001000100001000001101111
1111011000001100010010010001100000110111
1111011000011100110101011001110000110111
1110110000111001100000001100111000011011
1110110001110011001000100110011100011011
1101100011100010000000000010001110001101
1001100111000000010000010000000111001100
0011000110000100100010001001000011000110
0111001100001101000111000101100001100111
1110001000011010000101000010110000100011
1110011000110000001000100000011000110011
1100010001100000001000100000001100010001
1000110011000100010010010001000110011000
0000100110001000110111011000100011001000
0001100100010001100111001100010001001100
0001001000100011001111100110001000100100
0011001001000010001111100010000100100110
0110010010000000011111110000000010010011
1110010100000100111111111001000001010011
1100100000001101111101111101100000001001
1000101000011011111000111110110000101000
0001000000110011111010111110011000000100
0001010001100011110111011110001100010100
0010000011000111110111011111000110000010
0110100110001111101111101111100011001011
1100000100011111001101100111110001000001
1001001000111110011000110011111000100100
0000001001111100111000111001111100100000
0010010011111101110000011101111110010010
0100010111111111110000011111111111010001
1000100111111011100010001110111111001000
根据行业习惯,1表示黑色格子,0表示白色格子;左下角是起点,最下面一行是第一行,最左面一列是第一列;最上面一行的后一行是第一行,反之,第一行的前面一行是最上面一行,同理,第一列的前一列是最右边一列,最右一列的后一列是第一列。最左边的一列从起点开始依次是:10001100001110000011110011111110001100000,仔细观察后发现,可以用6个分数表示:1/3,2/4,3/5,4/2,7/3,2/5;分子表示1的个数,分母表示0的个数,这样的分数称之为“规则”。第二列从起点开始的规律和第一列的规律正好向上差一行,每一列都有和前一列相差的行数,以后都是类似,只是相差不同而已,由相差的行数可得到一个序列:1,1,2,2,2,2,2,1,1,1,1,1,1,3,1,1,1,2,2,1,-1,-2,-2,-1,-1,-1,-3,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-1,-1,负数为向下差;进一步分析表明,可以用14个分数简化之,即:1/2,2/5,1/6,3/1,1/3,2/2,1/1,-1/1,-2/2,-1/3,-3/1,-1/6,-2/5,-1/2;分子表示差的值,分母表示这样的差连续有几个,这样的分数称之为“飞数”,如果这样得到的最后一列和第一列不同,则说明不能生成漂亮面料。现在请你设计一个漂亮的面料。

Input
本题的输入共有5行,第一行是2个整数M,N;第二行是M个整数,表示“规则”的分子;第三行也是M个整数,表示“规则”的分母;其中第二行和第三行是按序对应;第四行是N个整数,表示“飞数”的分子;第五行也是N个整数,表示“飞数”的分母;其中第四行和第五行也是按序对应。输入数据保证生成的矩阵的行和列数不超过200;如果能够生成漂亮面料,则因为最后一列和第一列相同,所以不需输出最后一列;如果不能生成,则输出Can not make beautilful cloth !。

Output
按照前面题目的描述输出有0和1组成的二维矩阵。

Sample Input
  
6 14 1 2 3 4 7 2 3 4 5 2 3 5 1 2 1 3 1 2 1 -1 -2 -1 -3 -1 -2 -1 2 5 6 1 3 2 1 1 2 3 1 6 5 2

Sample Output
  
参见前面的例子。


练耐心的题目,一遍过。


完整代码:

/*15ms,280KB*/#include<cstdio>int mat[202][202], rule[2][202];int main()
{int m, n, i, j, county = 0, countx = 1, sum = 0;scanf("%d%d", &m, &n);for (i = 0; i < m; ++i)scanf("%d", &rule[0][i]);for (i = 0; i < m; ++i)scanf("%d", &rule[1][i]);for (i = 0; i < m; ++i){while (rule[0][i]--)mat[county++][0] = 1;while (rule[1][i]--)mat[county++][0] = 0;}for (i = 0; i < n; ++i)scanf("%d", &rule[0][i]);for (i = 0; i < n; ++i)scanf("%d", &rule[1][i]);for (i = 0; i < n - 1; ++i){sum += rule[0][i] * rule[1][i];if (rule[0][i] > 0)while (rule[1][i]--){for (j = rule[0][i]; j < county; ++j)mat[j][countx] = mat[j - rule[0][i]][countx - 1];for (j = 0; j < rule[0][i]; ++j)mat[j][countx] = mat[county - rule[0][i] + j][countx - 1];++countx;}else{rule[0][i] = -rule[0][i];while (rule[1][i]--){for (j = 0; j < county - rule[0][i] ; ++j)mat[j][countx] = mat[j + rule[0][i]][countx - 1];for (; j < county; ++j)mat[j][countx] = mat[j - county + rule[0][i]][countx - 1];++countx;}}}if (sum + rule[0][i] * rule[1][i])printf("Can not make beautilful cloth !");else if (rule[1][i] != 1){if (rule[0][i] > 0)while (--rule[1][i]){for (j = rule[0][i]; j < county; ++j)mat[j][countx] = mat[j - rule[0][i]][countx - 1];for (j = 0; j < rule[0][i]; ++j)mat[j][countx] = mat[county - rule[0][i] + j][countx - 1];++countx;}else{rule[0][i] = -rule[0][i];while (--rule[1][i]){for (j = 0; j < county - rule[0][i] ; ++j)mat[j][countx] = mat[j + rule[0][i]][countx - 1];for (; j < county; ++j)mat[j][countx] = mat[j - county + rule[0][i]][countx - 1];++countx;}}}for (i = county - 1; i >= 0; --i){for (j = 0; j < countx; ++j)printf("%d", mat[i][j]);printf("\n");}return 0;
}



这篇关于HDU 1278 漂亮面料的设计(超级模拟)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777794

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin