uva 10001(回溯)

题意:这题实在太难懂了。。先给出了一个数字aut,他的二进制可以放到表格中new中,例子中的就是90的二进制就是new里从上到下表示的,在将数字放进去后,这就形成了一个转化规则,然后再输入n和1个长度为n由01组成数字,判断根据这个序列和转化规则这个转化能否形成一个新的序列是一个环。

题解:用一个now[N]数组存储新序列,注意由输入得到的tar[N]序列的tar[0]去比对new即给出的aut 的二进制可以取出对应的转化之前的三个数字,放到now[0],now[1],now[2]中,然后如果tar[1]也比对aut的二进制又找到三个数字,如果这三个数字的前两个和now[1],now[2]对应相等,可以确定now[3],之后以此类推,如果一直能推到最后一个tar[n - 1],并且新序列的最后两个数和开头两个数相等说明有环,输出R...E 否则继续递归寻找直至结束都没有就是GARDEN...

#include <stdio.h>
const int N = 35;

int aut, n, flag, now[N], tar[N], aft[N];
int rule[8][3] = {{0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}};

void dfs(int cur) {
	if (cur == n) {
		if (now[0] == now[n] && now[1] == now[n + 1])
			flag = 1;
		return;
	}
	for (int i = 0; i < 8; i++) {
		if (aft[i] == tar[cur] && rule[i][0] == now[cur] && rule[i][1] == now[cur + 1] ) {
			now[cur + 2] = rule[i][2];
			dfs(cur + 1);
		}
	}
}

int main() {
	char c;
	while (scanf("%d%d", &aut, &n) != EOF) {
		flag = 0;
		for (int i = 0; i < 8; i++) {
			if (aut & (1 << i))
				aft[i] = 1;
			else
				aft[i] = 0;
		}
		getchar();
		for (int i = 0; i < n; i++) {
			scanf("%c", &c);
			tar[i] = c - '0';
		}
		for (int i = 0; i < 8; i++)
			if (aft[i] == tar[0]) {
				now[0] = rule[i][0];
				now[1] = rule[i][1];
				now[2] = rule[i][2];
				dfs(1);
				if (flag)
					break;
			}
		if (flag)
			printf("REACHABLE\n");
		else
			printf("GARDEN OF EDEN\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值