USACO transform 那道,跪求大神们解答啊。。。
usaco吧
全部回复
仅看楼主
level 1
okayroc 楼主
这个是NOCOW 上的题目翻译
描述
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
1:转90度:图案按顺时针转90度。
2:转180度:图案按顺时针转180度。
3:转270度:图案按顺时针转270度。
4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。
6:不改变:原图案不改变。
7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
一个步骤就要搞定[编辑]格式
PROGRAM NAME: transform
INPUT FORMAT:
file (transform.in)
第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。
OUTPUT FORMAT:
file (transform.out)
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。[编辑]SAMPLE INPUT3
@-@
---
@@-
@-@
@--
--@
[编辑]SAMPLE OUTPUT
1
下面是我的问题
INPUT:
4
@-@@
@@@@
@@@@
@@@@
@@@@
@@@@
@@@@
@-@@
这个 测试 数据 的 答案 为什么 不是 4 而是 5呢 不是 经过一次水平反转 就得到 新的了么?
2012年02月06日 02点02分 1
level 3
有知道的 跟我说一下吧。。。在线等。。真的 不理解啊[我错了] ,谢谢了 先。。。
2012年02月06日 02点02分 2
level 3
是不是 啊,大家 回个话啊
2012年02月06日 04点02分 3
level 3
非常感谢 [我错了]哈哈
2012年02月08日 05点02分 5
level 1
刚刚做完~
2012年02月11日 11点02分 6
level 1

刚刚做完哈
好像有点麻烦
/*
ID:
LANG: C++
PROG: transform
*/
#include<stdio.h>
#include<string.h>
int N;
char c1[11][11],c2[11][11],c3[11][11];
void clear(char (*cp1)[11])
{
memset(cp1,'\0',sizeof(cp1));
}
bool check(char (*cp1)[11],char (*cp2)[11])
{
for(int i=0;i<N;i++) if(strncmp(*(cp1+i),*(cp2+i),N)) return(0);
return(1);
}
void turn90(char (*cp1)[11],char (*cp2)[11])
{
clear(cp2);
for(int i1=0,i2=N-1;i1<N;i1++,i2--)
for(int j=0;j<N;j++) *(*(cp2+j)+i2)=*(*(cp1+i1)+j);
}
void turn180(char (*cp1)[11],char (*cp2)[11])
{
clear(cp2);
char c[11][11];
turn90(cp1,c);
turn90(c,cp2);
}
void turn270(char (*cp1)[11],char (*cp2)[11])
{
clear(cp2);
char c[11][11];
turn180(cp1,c);
turn90(c,cp2);
}
void turn(char (*cp1)[11],char (*cp2)[11])
{
clear(cp2);
for(int i=0;i<N;i++)
for(int j1=0,j2=N-1;j1<N;j1++,j2--)
*(*(cp2+i)+j2)=*(*(cp1+i)+j1);
}
bool unit()
{
char c[11][11],cc[11][11];
turn(c1,c);
turn90(c,cc);
if(check(cc,c2)) return(1);
turn180(c,cc);
if(check(cc,c2)) return(1);
turn270(c,cc);
return(check(cc,c2));
}
int doit()
{
int i=1;
while(i)
{
switch(i)
{
case 1:turn90(c1,c3);break;
case 2:turn180(c1,c3);break;
case 3:turn270(c1,c3);break;
case 4:turn(c1,c3);break;
case 5:if(unit()) return(5);break;
case 6:if(check(c1,c2)) return(6);
else return(7);
}
if(check(c3,c2)) return(i);
i++;
}
}
int main()
{
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
scanf("%d",&N);
for(int i=0;i<N;i++) scanf("%s",c1[i]);
for(int i=0;i<N;i++) scanf("%s",c2[i]);
printf("%d\n",doit());
return 0;
}
2012年03月24日 04点03分 7
level 1
水平翻转指的是把
@-@@
@@@@
@@@@
@@@@
变成
@@-@
@@@@
@@@@
@@@@
2012年07月20日 03点07分 8
level 7
欢迎访问NOCOW
2013年07月10日 00点07分 10
1