【USACO 1.2.2】方块转换

【问题描述】


一块N x
N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。

5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。

6:不改变:原图案不改变。

7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

一个步骤就要搞定

【格式】

INPUT FORMAT:

file (transformations.in)

第一行: 单独的一个整数N。

第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。

第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

OUTPUT FORMAT:

file (transformations.out)

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

【分析】


模拟,压位。

只提醒一个地方:如果有多种可用的转换方法,请选择序号最小的那个


  1 #include <cstdlib>
2 #include <iostream>
3 #include <cstdio>
4 #include <cmath>
5 #include <algorithm>
6 #include <cstring>
7 const int maxn=15;
8 const int INF=0x7fffffff;
9 using namespace std;
10 int n;
11 struct pic
12 {
13 int data[15];
14 //比较运算符
15 bool operator ==(const pic &b)const
16 {
17 int i,flag=1;
18 for (i=1;i<=n;i++)
19 {
20 if (data[i]!=b.data[i])
21 {
22 flag=0;
23 break;
24 }
25 }
26 return flag;
27 }
28 }from,to;
29
30 void init(pic &t);//输入
31 void solve();
32 void turn(pic &t);//旋转90度
33 void fc(pic &t);//反射
34
35 int main()
36 {
37 //文件操作
38 freopen("transformations.in","r",stdin);
39 freopen("transformations.out","w",stdout);
40
41 scanf("%d",&n);
42 init(from);
43 init(to);
44 solve();//解决
45 return 0;
46 }
47 void init(pic &t)
48 {
49 int i,j;
50 memset(t.data,0,sizeof(t.data));
51 for (i=1;i<=n;i++)
52 {
53 char str[maxn];
54 scanf("%s",str);
55 for (j=0;j<n;j++)
56 t.data[i]=(t.data[i]<<1)+(str[j]==‘-‘?0:1);
57 }
58 return;
59 }
60 void solve()
61 {
62 pic temp=from;
63 //旋转三次
64 turn(temp);if (temp==to) {printf("1");return;}
65 turn(temp);if (temp==to) {printf("2");return;}
66 turn(temp);if (temp==to) {printf("3");return;}
67
68 temp=from;
69 fc(temp);if (temp==to) {printf("4");return;}
70 turn(temp);if (temp==to) {printf("5");return;}
71 turn(temp);if (temp==to) {printf("5");return;}
72 turn(temp);if (temp==to) {printf("5");return;}
73 if (from==to) {printf("6\n");return;}
74 printf("7\n");//无法获得
75 return;
76 }
77 void turn(pic &t)
78 {
79 int i,j;
80 pic c;
81 memset(c.data,0,sizeof(c.data));
82 for (i=n;i>=1;i--)
83 {
84 for (j=1;j<=n;j++)
85 {
86 int temp;
87 temp=(((1<<(j-1))&t.data[i])==(1<<(j-1)));
88 c.data[n-j+1]=(c.data[n-j+1]<<1)+temp;
89 }
90 }
91 t=c;
92 }
93 void fc(pic &t)
94 {
95 int i,j;
96 pic c;
97 memset(c.data,0,sizeof(c.data));
98 for (i=1;i<=n;i++)
99 {
100 //从左边一位一位取
101 for (j=1;j<=n;j++)
102 {
103 int temp;
104 temp=(((1<<(j-1))&t.data[i])==(1<<(j-1)));
105 c.data[i]=(c.data[i]<<1)+temp;
106 }
107 }
108 t=c;
109 }

【USACO 1.2.2】方块转换,布布扣,bubuko.com

时间: 2024-10-13 21:57:43

【USACO 1.2.2】方块转换的相关文章

方块转换

1387 方块转换 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:#1:转90度:图案按顺时针转90度.#2:转180度:图案按顺时针转180度.#3:转270度:图案按顺时针转270度.#4:反射:图案在水平方向翻转(形成原图案的镜像).#5:组合:图案在水平

方块转换 transform

方块转换 transform [题目描述]: 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案. 写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: #1:转90 度:图案按顺时针转90 度. #2:转180 度:图案按顺时针转180 度. #3:转270 度:图案按顺时针转270 度. #4:反射:图案在水平方向翻转(形成原图案的镜像). #5:组合:图案在水平方向翻转,然后按照#1-#3 之一转换. #6:不改变:原图案不改变. #7:无效

洛谷 P1205 [USACO1.2]方块转换 Transformations

题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. 2:转180度:图案按顺时针转180度. 3:转270度:图案按顺时针转270度. 4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像). 5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换. 6:不改变:原图案不改变. 7:无效转换:无法用以上方法得到新图案. 如果有

【USACO1.2_2】★Transformations 方块转换

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案依照下面列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. 2:转180度:图案按顺时针转180度. 3:转270度:图案按顺时针转270度. 4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像). 5:组合:图案在水平方向翻转,然后再依照1到3之间的一种再次转换. 6:不改变:原图案不改变. 7:无效转换:无法用以上方法得到新图案. 假设有多种可用的

Transformations 方块转换

题目是中文题,就不做什么解释了,纯模拟题,主要要搞清楚这几种装换方式下标的变化: 第一种:顺时针旋转90度: c[j][n-i+1]=a[i][j]; 第二种:旋转180度: c[n-i+1][n-j+1]=a[i][j]; 第三种:顺时针旋转270度: c[i][j]=a[j][n-i+1]; 第四种:反射 c[i][n-j+1]=a[i][j]; 第五种:组合 先反射:c[i][n-j+1]=a[i][j]; 然后再按照1到3之间的一种再次转换. 第六种:不改变 c[i][j]=a[i][j

luogu P1205 方块转换

题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. 2:转180度:图案按顺时针转180度. 3:转270度:图案按顺时针转270度. 4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像). 5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换. 6:不改变:原图案不改变. 7:无效转换:无法用以上方法得到新图案. 如果有

创意俄罗斯方块

版权声明:访问者可将本网站提供的内容或服务用于个人学习.研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利.除此以外,将本网站任何内容或服务用于其他用途时,须征得本网站及相关权利人的书面许可,并支付报酬.转载需表明文章地址. 本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,予以删除. 作者QQ:1765813715 由于这个游戏倾入了我大量的时间和创意 所以写了个版权声明 这个游戏在基础的俄罗斯方块上面还添加了 

USACO 1.2 Dual Palindromes (回文,进制转换)

废话不哆嗦,贴代码: /* ID:twd30651 PROG:dualpal LANG:C++ */ #include<iostream> #include<fstream> #include<stdlib.h> #include<string.h> using namespace std; char s[100]; int N,S; void gs(int num,int BASE) { int index=0; while(num/BASE) { s[i

USACO 1.2 Palindromic Squares (进制转换,回文)

/* ID:twd30651 PROG:palsquare LANG:C++ */ #include<iostream> #include<fstream> #include<stdlib.h> #include<string.h> using namespace std; int BASE; char B[]={'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H',