題目
題目意思是每行輸入兩個篩子蚊夫,然后判斷兩個篩子的是不是用了相同的噴涂方式券时,即兩個篩子是否為同一個(忽略數(shù)字)邮旷。每個篩子最多有三種顏色r黄选、g、b婶肩。每行輸入12個字符不含空格办陷。
我們可以想想,如果我們?nèi)藖聿僮魇窃趺礃幼龅模?br>
第一步是把同色的一面對著自己律歼。(此時視為頂部民镜,編號1)
第二步是看底部是否同色。(底部編號6)
第三步是看能否通過水平旋轉(zhuǎn)使得完全相同险毁。
想清楚之后就可以敲代碼了制圈。值得注意的是輸入的處理,筆者這里用了一個函數(shù)read()來讀入畔况,也增加一點抗性鲸鹦。還有使用string里面的函數(shù)時要確保字符串有結(jié)束符。
代碼
#include <stdio.h>
#include <string.h>
const int maxn = 6;
char c1[maxn + 2], c2[maxn + 2], ct[maxn + 2];
int read();
void find(char s[], char aid, int index[]);
void turn(char s[], int i);
void turnH(char s[]);
void turnV(char s[]);
int main() {
#ifdef TEST
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif // TEST
while (read()) {
int flag = 0;
int index[maxn + 2];
find(c1, c2[1], index);
for (int i = 0; i < 6 && index[i]; i++) {
strcpy(ct, c1); turn(ct, index[i]);
if (ct[6] != c2[6]) continue;
for (int j = 0; j < 4 && strcmp(ct, c2); j++) turnH(ct);
if (!strcmp(ct, c2)) flag = 1;
}
if (flag) printf("TRUE\n");
else printf("FALSE\n");
}
return 0;
}
int read(){
//因為會用到大量的string里的函數(shù)跷跪,所以需要確保有結(jié)束符馋嗜。
memset(c1, ' ', sizeof(c1)); c1[7] = '\0';
memset(c2, ' ', sizeof(c2)); c2[7] = '\0';
char ch = getchar();
//最有可能讀到的不想要的字符就是這兩個
while (ch == '\n' || ch == ' ') ch = getchar();
if (ch == EOF) return 0;
c1[1] = ch;
for (int i = 2; i <= maxn; i++) c1[i] = getchar();
for (int i = 1; i <= maxn; i++) c2[i] = getchar();
return 1;
}
void find(char s[], char aid, int index[]){
memset(index, 0, sizeof(index));
for (int i = 1, n = 0; i <= 6; i++)
if (s[i] == aid) index[n++] = i;
}
void turn(char s[], int i){
switch (i)
{
case 2:
turnV(s); turnV(s); turnV(s); break;
case 3:
turnH(s); turnH(s); turnH(s); turnV(s); break;
case 4:
turnH(s); turnV(s); break;
case 5:
turnV(s); break;
case 6:
turnV(s); turnV(s); break;
default:
break;
}
}
//從上往下看逆時針,1在頂
void turnH(char s[]){
char t = s[2];
s[2] = s[3];
s[3] = s[5];
s[5] = s[4];
s[4] = t;
}
//從右往左看逆時針域庇,1在頂嵌戈,2在前
void turnV(char s[]) {
char t = s[1];
s[1] = s[5];
s[5] = s[6];
s[6] = s[2];
s[2] = t;
}
原題
UVa253