习题4-4 骰子涂色(Cube painting,UVa 253)

原题链接:
分类:函数
备注:思维
前言:不要在本题怀疑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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JILIN.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值