又是模拟题,估计一开始usaco都是模拟题。
这个模拟题比较麻烦,需要模拟两种状态。
1,翻转90度。
2,镜像翻转。
注意:如果有多种可能,输出序号小的。
/* ID: rowanha3 LANG: C++ TASK: transform */ #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; int map[11][11]; int map1[11][11]; int map2[11][11]; int maps[11][11]; int n; int bijiao()//比较翻转后的结果 { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(map2[i][j]!=maps[i][j])return 0; } } return 1; } void zhi()//把中转数组置为翻转后的数组 { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { map1[i][j]=map2[i][j]; } } } void fanzhuan()//翻转90度 { int i,j; for(j=0;j<n;j++) { for(i=n-1;i>=0;i--) { map2[j][n-1-i]=map1[i][j]; } } } int dos()//进行1~3步的翻转 { zhi(); fanzhuan(); if(bijiao())return 1; zhi(); fanzhuan(); if(bijiao())return 2; zhi(); fanzhuan(); if(bijiao())return 3; return 0; } int jing()//进行镜像翻转 { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { map2[i][j]=map[i][n-j-1]; } } if(bijiao())return 1; return 0; } int main() { freopen("transform.in","r",stdin); freopen("transform.out","w",stdout); cin>>n; getchar(); int i,j; char c; for(i=0;i<n;i++) { for(j=0;j<n;j++) { c=getchar(); if(c=='@')map[i][j]=map1[i][j]=map2[i][j]=0; else map[i][j]=map1[i][j]=map2[i][j]=1; } getchar(); } for(i=0;i<n;i++) { for(j=0;j<n;j++) { c=getchar(); if(c=='@')maps[i][j]=0; else maps[i][j]=1; } getchar(); } int leapp; leapp=0; if(bijiao())leapp=1; if(1) { int leap; leap=dos(); if(leap)cout<<leap<<endl; else if(jing())cout<<"4"<<endl; else { if(dos()) { cout<<"5"<<endl; } else if(leapp) cout<<"6"<<endl; else cout<<"7"<<endl; } } fclose(stdin); fclose(stdout); return 0; }
作者:rowanhaoa 发表于2013-3-15 19:03:18 原文链接
阅读:47 评论:0 查看评论