今天我们只讲一到题(看标题就只到了),在这一到题里,我们先要了解以下四个问题:
1:输入一个二维数组,将他90度旋转。
我们先来分析一下
T T F T T T
T F F 转换到 T F T
T T F F F F
我们需要把左图换到右图,怎们办?
为了更清楚,我用一到九表示,如下:
1 2 3 7 4 1
4 5 6 转换到 85 2
7 8 9 9 6 3
现在思考了,怎们办?
我们首先观察,1在左图的坐标是1,1;换后坐标是1,3;在观察4,左图的坐标是2,1;换后坐标是1.2;发现了什么?
假设本来的坐标i,j;二位数组的边长为n那么转换后的就为j,n-i+1;不信自己在是几个。
代码如下(思想正确,但是不保证粘贴正确))
for(i=1,i<=n,i++)
for(j=1,j<=n,j++)
c[j,n-i+1]=a[i,j];
2:输入一个二维数组,将他180度旋转。
1 2 3 9 8 7
4 5 6 转换到 6 5 4
7 8 9 3 2 1
现在思考了,怎们办?
我们首先观察,1在左图的坐标是1,1;换后坐标是3,3;在观察4,左图的坐标是2,1;换后坐标是2,3;发现了什么?(如果前面的理解透了,后面的就容易了)
假设本来的坐标i,j;二位数组的边长为n那么转换后的就为n-i+1,n-j+1;不信自己在是几个。
代码如下(思想正确,但是不保证粘贴正确)
for(int i=1,i<=n;i++)
for(int j=1,j<=n;j++)
c[n-i+1,n-j+1]=a[i,j];
3:输入一个二维数组,将他270度旋转。
1 2 3 3 6 9
4 5 6 转换到 2 5 8
7 8 9 1 4 7
现在思考了,怎们办?
前面的90度理解透了,这个也很简单了(就是逆时针90度嘛);
上代码
for(inti=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-j+1][n]=a[i][j];
4:输入一个二维数组,将他水平方向翻转;
首先,你们会有疑问:水平方向是什么意思?
答案:就是一个二维数组照镜子(让我想起了一句俗语:猪八戒照镜子——里外不是人)
我们在画图
1 2 3 3 2 1
4 5 6 转换到 6 5 4
7 8 9 9 8 7
这一个你一定很好理解,如果是奇数,就是两边交换,中间不交换,如果是偶数,就是两边都交换;
上代码:
int t;
for(int i=1;i<=n;i++)
for(intj=1;j<=n;j++)
c[i][j]=a[i][j];
for(inti=1;i<=n;i++)
for(intj=1;i<=/2;j++)
{
t=c[i][j];
c[i][j]=c[i][n]-j+1];
c[i][n-j+1]=t;
}
Ok,好了,上大题目
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度。 2:转180度:图案按顺时针转180度。 3:转270度:图案按顺时针转270度。 4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。 5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。 6:不改变:原图案不改变。 7:无效转换:无法用以上方法得到新图案。如果有多种可用的转换方法,请选择序号最小的那个。
输入
第一行:单独的一个整数N。第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形
输出
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
(无测试数据)
What,发测试数据都不给!无语。。。。。。
自己写
3
@-@
---
@@-
@-@
@--
--@
会了上面的四个,这就没问题了(只是太长了)
代码:
#include<bits/stdc++.h>
usingnamespace std
;
int n
;
boola
[11][11],b
[11][11],c
[11][11];
voidinit()
{
char
p
;
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
{
cin
>>p
;
if(
p
=='@')a
[i
][j
]=true;
else
a
[i
][j
]=false;
}
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
{
cin
>>p
;
if(
p
=='@')b
[i
][j
]=true;
else
b
[i
][j
]=false;
}
}
voidnum1()
{
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
c
[j
][n
-i
+1]=a
[i
][j
];
}
voidnum2()
{
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
c
[n
-i
+1][n
-j
+1]=a
[i
][j
];
}
voidnum3()
{
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
c
[n
-j
+1][n
]=a
[i
][j
];
}
voidnum4()
{
int
t
;
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
c
[i
][j
]=a
[i
][j
];
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;i
<=n
/2;j
++)
{
t
=c
[i
][j
];
c
[i
][j
]=c
[i
][n
-j
+1];
c
[i
][n
-j
+1]=t
;
}
}
boolIf()
{
int
z
=true;
for(int
i
=1;i
<=n
;i
++)
for(int
j
=1;j
<=n
;j
++)
if(
b
[i
][j
]!=c
[i
][j
])z
=false;
return
z
;
}
intmain()
{
cin
>>n
;
init();
num1();
if(If()){
cout
<<1;return0;}
num2();
if(If()){
cout
<<2;return0;}
num3();
if(If()){
cout
<<3;return0;}
num4();
if(If()){
cout
<<4;return0;}
num4();num1();
if(If()){
cout
<<5;return0;}
num4();num2();
if(If()){
cout
<<5;return0;}
num4();num3();
if(If()){
cout
<<5;return0;}
if(If()){
cout
<<6;return0;}
cout
<<7;
return0;
}
但是程序只有30分,为什么。
看了这程序,
多看一点就发现了
num4();num1();
if(If()){
cout
<<5;return0;}
num4();num2();
if(If()){
cout
<<5;return0;}
num4();num3();
if(If()){
cout
<<5;return0;}
a数组是不变的,所以在mun1,2,3后,就相当于直接mun1,2,3;
所以要另写函数
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n;
bool a[11][11],b[11][11],c[11][11];
void init()
{
char p;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>p;
if(p=='@')a[i][j]=true;
else a[i][j]=false;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>p;
if(p=='@')b[i][j]=true;
else b[i][j]=false;
}
}
void num1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[j][n-i+1]=a[i][j];
}
void num2()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-i+1][n-j+1]=a[i][j];
}
void num3()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-j+1][n]=a[i][j];
}
void num4()
{
int t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;i<=n/2;j++)
{
t=c[i][j];
c[i][j]=c[i][n-j+1];
c[i][n-j+1]=t;
}
}
void num6()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=a[i][j];
}
bool If()
{
int z=true;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])z=false;
return z;
}
int main()
{
cin>>n;
init();
num1();
if(If()){cout<<1;return 0;}
num2();
if(If()){cout<<2;return 0;}
num3();
if(If()){cout<<3;return 0;}
num4();
if(If()){cout<<4;return 0;}
num4();num1();
if(If()){cout<<5;return 0;}
num4();num2();
if(If()){cout<<5;return 0;}
num4();num3();
if(If()){cout<<5;return 0;}
num6();
if(If()){cout<<6;return 0;}
cout<<7;
return 0;
}
发现还是没有满分,为什么?
现在应该看不出来了,
我来告诉你吧
void num4()
{int t;for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;i<=n/2;j++) { t=c[i][j]; c[i][j]=c[i][n-j+1]; c[i][n-j+1]=t; }}
其实还有更加简便的方法
我们可以继续找规律
1 2 3 3 2 1
4 5 6 转换到 6 5 4
7 8 9 9 8 7
现在思考了,怎们办?
我们首先观察,1在左图的坐标是1,1;换后坐标是1,3;在观察4,左图的坐标是2,1;换后坐标是3,2;发现了什么?
假设本来的坐标i,j;二位数组的边长为n那么转换后的就为i,n-j+1;不信自己在是几个。
好了,下面是满分代码(我改了一个地方是错的,粘贴一定不正确):
#include<bits/stdc++.h>
using namespace std;
int n;
bool a[11][11],b[11][11],c[11][11],d[11][11];
void init()
{
char p;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>p;
if(p=='@')a[i][j]=true;
else a[i][j]=false;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>p;
if(p=='@')b[i][j]=true;
else b[i][j]=false;
}
}
void num1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[j][n-i+1]=a[i][j];
}
void num2()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-i+1][n-j+1]=a[i][j];
}
void num3()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-j+1][n]=a[i][j];
}
void num4()
{
int t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][n-j+1]=a[i][j];
}
void num6()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=a[i][j];
}
bool If()
{
int z=true;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][j]!=c[i][j])z=false;
return z;
}
void zhan()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=c[i][j];
}
void o1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[j][n-i+1]=d[i][j];
}
void o2()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-i+1][n-j+1]=d[i][j];
}
void o3()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[n-j+1][n]=d[i][j];
}
int main()
{
cin>>n;
init();
num1();
if(If()){cout<<1;return 0;}
num2();
if(If()){cout<<2;return 0;}
num3();
if(If()){cout<<3;return 0;}
num4();
if(If()){cout<<4;return 0;}
zhan();
num4();o1();
if(If()){cout<<5;return 0;}
num4();o2();
if(If()){cout<<5;return 0;}
num4();o3();
if(If()){cout<<5;return 0;}
num6();
if(If()){cout<<6;return 0;}
cout<<7;
return 0;
}
另外,快期末考了,祝大家考出好成绩。
出自于——2017年1月15日