題目描述
一塊N x N(1<=N<=10)正方形的黑白瓦片的圖案要被轉換成新的正方形圖案。寫一個程序來找出將原始圖案按照以下列轉換方法轉換成新圖案的最小方式:
1:轉90度:圖案按順時針轉90度。
2:轉180度:圖案按順時針轉180度。
3:轉270度:圖案按順時針轉270度。
4:反射:圖案在水平方向翻轉(以中央鉛垂線為中心形成原圖案的鏡像)。
5:組合:圖案在水平方向翻轉,然后再按照1到3之間的一種再次轉換。
6:不改變:原圖案不改變。
7:無效轉換:無法用以上方法得到新圖案。
如果有多種可用的轉換方法,請選擇序號最小的那個。
只使用1–7中的一個步驟來完成這次轉換。
輸入輸出格式
輸入格式:
第一行: 單獨的一個整數N。
第二行到第N+1行: N行每行N個字符(不是“@”就是“-”);這是轉換前的正方形。
第N+2行到第2*N+1行: N行每行N個字符(不是“@”就是“-”);這是轉換后的正方形。
輸出格式:
單獨的一行包括1到7之間的一個數字(在上文已描述)表明需要將轉換前的正方形變為轉換后的正方形的轉換方法。
輸入輸出樣例
輸入樣例#1:
輸出樣例#1:
1
說明
題目翻譯來自NOCOW。
USACO Training Section 1.2
.
.
.
.
.
.
分析
一道模擬題
這里調換了2和3,是因為不存在順時針轉90度不可行,而順時針轉180度和逆時針轉90度同時可行的情況。
.
.
.
.
.
.
程序:
#include<iostream>
using namespace std;
int n,flag,f,g,h,x,y,p,z;
char a[100][100],b[100][100],c[100][100],d[100][100],e[100][100],w[100][100],r[100][100],t[100][100];
int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>d[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=a[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){flag=1;break;}if(flag==0){cout<<1;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)e[i][j]=a[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)w[i][j]=e[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(w[i][j]!=d[i][j]){f=1;break;}if(f==0&&flag==1){cout<<3;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)r[i][j]=a[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=r[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(t[i][j]!=d[i][j]){g=1;break;}if(g==0&&f==1&&flag==1){cout<<2;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(t[i][j]!=d[i][j]){x=1;break;}if(x==0&&g==1&&f==1&&flag==1){cout<<4;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[j][i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){y=1;break;}if(y==0&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){z=1;break;}if(z==0&&y==1&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)t[i][j]=a[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=t[n+1-i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]=b[i][n+1-j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(c[i][j]!=d[i][j]){p=1;break;}if(p==0&&z==1&&y==1&&x==1&&g==1&&f==1&&flag==1){cout<<5;return 0;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][j]!=d[i][j]){h=1;break;}if(h==0&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1){cout<<6;return 0;}if(h==1&&x==1&&y==1&&z==1&&p==1&&g==1&&f==1&&flag==1)cout<<7;return 0;
}
轉載于:https://www.cnblogs.com/YYC-0304/p/10292831.html
總結
以上是生活随笔為你收集整理的洛谷 P1205 [USACO1.2]方块转换 Transformations的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。