原题链接:
分类:函数
备注:思维
前言:不要在本题怀疑uDebug,如果没过就是你错了。对立面一一对应的解法能AC但是其实是题目数据太水,uDebug有反例,如rgbgrb grgrbb。实际情况更复杂一点,我只会暴力手算…,如果想找更优秀的解法得去看看别人的代码,并且学习点新知识。
错误却AC的代码如下:
#include<stdio.h>
char a[8], b[8], s[20];
int check(char* a, char* b)
{
int flag[3] = { 0 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
if (!flag[j]&&((a[i] == b[j] && a[5 - i] == b[5 - j]) || (a[i] == b[5 - j] && a[5 - i] == b[j])))
{
flag[j] = 1;
break;
}
}
for (int i = 0; i < 3; i++)if (!flag[i])return 0;
return 1;
}
int main(void)
{
int kase = 0;
while (fgets(s, 20, stdin))
{
for (int i = 0; i < 6; i++)
{
a[i] = s[i];
b[i] = s[i + 6];
}
if (check(a, b))printf("TRUE\n");
else printf("FALSE\n");
}
return 0;
}
正确AC但异常暴力的代码如下:
#include<stdio.h>
char fis[8], sec[8], tmp[8], s[20];//123456,263415,653421,513462,326154,421653,六个字母按顺序作为1号位的位置排放
int kase1()
{
for (int j = 0; j < 6; j++)if (tmp[j] != fis[j])return 0;
return 1;
}
int kase2(char* c)
{
c[1] = tmp[3];c[4] = tmp[2];
c[2] = tmp[1];c[3] = tmp[4];
for (int j = 0; j < 6; j++)if (c[j] != fis[j])return 0;
return 1;
}
int kase3(char* c)
{
c[1] = tmp[4];c[2] = tmp[3];
c[3] = tmp[2];c[4] = tmp[1];
for (int j = 0; j < 6; j++)if (c[j] != fis[j])return 0;
return 1;
}
int kase4(char* c)
{
c[1] = tmp[2];c[2] = tmp[4];
c[3] = tmp[1];c[4] = tmp[3];
for (int j = 0; j < 6; j++)if (c[j] != fis[j])return 0;
return 1;
}
int check()//中间这层水平转动,一共4种情况
{
char c[8];c[0] = tmp[0]; c[5] = tmp[5];
if (kase1())return 1;if (kase2(c))return 1;
if (kase3(c))return 1;if (kase4(c))return 1;
return 0;
}
int main(void)
{
while (fgets(s, 20, stdin))
{
int flag = 0, sec[8];
for (int i = 0; i < 6; i++)
{
fis[i] = s[i];
tmp[i] = sec[i] = s[i + 6];
}
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
tmp[0] = sec[1]; tmp[1] = sec[5]; tmp[2] = sec[2];
tmp[3] = sec[3]; tmp[4] = sec[0]; tmp[5] = sec[4];
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
tmp[0] = sec[5]; tmp[1] = sec[4]; tmp[2] = sec[2];
tmp[3] = sec[3]; tmp[4] = sec[1]; tmp[5] = sec[0];
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
tmp[0] = sec[4]; tmp[1] = sec[0]; tmp[2] = sec[2];
tmp[3] = sec[3]; tmp[4] = sec[5]; tmp[5] = sec[1];
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
tmp[0] = sec[2]; tmp[1] = sec[1]; tmp[2] = sec[5];
tmp[3] = sec[0]; tmp[4] = sec[4]; tmp[5] = sec[3];
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
tmp[0] = sec[3]; tmp[1] = sec[1]; tmp[2] = sec[0];
tmp[3] = sec[5]; tmp[4] = sec[4]; tmp[5] = sec[2];
if (check())flag = 1; if (flag) { printf("TRUE\n"); continue; }
printf("FALSE\n");
}
return 0;
}