POJ 1248 Safecracker

#include <stdio.h>

#define MAX_LETTERS 13
#define CHAR_TO_INT(c) ( (c) - 'A' + 1 )

int target;
char letters[MAX_LETTERS];
int len;

int strCmp(char *from, char *to){
	while (*from == *to){
		if (*from == '\0'){
			return 0;	
		} 
		from++;
		to++;
	}
	return (*from - *to);
}

int myPow(int base, int exponent){
	int result = 1;
	while (exponent--){
		result *= base;
	}
	return result;
}

int strLen(char *str){
	char *p = str;
	while (*p != '\0'){
		p++;
	}
	return (p - str);
}
  
void bubbleSortLetters( ){
	len = strLen(letters);
	int time;
	for (time = 1; time < len; time++){
		int needContinue = 0;
		int compare;
		for (compare = 0; compare < len - 1; compare++){
			if (letters[compare] < letters[compare + 1]){
				needContinue = 1;
				int temp = letters[compare];
				letters[compare] = letters[compare + 1];
				letters[compare + 1] = temp;
			}
		}
		if (!needContinue){
			break;
		}
	}
}

int main(){
	//freopen("input.txt", "r", stdin);
	while (1){
		scanf("%d %s", &target, letters);
		if (target == 0 && strCmp(letters, "END") == 0){
			return 0;
		}
		bubbleSortLetters( );
		int found = 0;
		int v, w, x, y, z;
		for (v = 0; v < len; v++){
			//能放到外循环的计算就不要放在内循环
			int valueV = myPow( CHAR_TO_INT( letters[v] ), 1);
			for (w = 0; w < len; w++){
				if (w == v){
					//剪枝,下面的contine都是剪枝
					continue;
				}
				int valueW = myPow( CHAR_TO_INT( letters[w] ), 2);
				for (x = 0; x < len; x++){
					if (x == v || x == w){
						continue;
					}
					int valueX = myPow( CHAR_TO_INT( letters[x] ), 3);
					for (y = 0; y < len; y++){
						if (y == v || y == w || y== x){
							continue;
						}
						int valueY = myPow( CHAR_TO_INT( letters[y] ), 4);
						for (z = 0; z < len; z++){
							if (z == v || z == w || z == x || z == y){
								continue;
							}
							int valueZ = myPow( CHAR_TO_INT( letters[z] ), 5);
							if ((valueV - valueW + valueX - valueY + valueZ ) == target){
								found = 1;
								goto output;
							}				
						}// for z
					}// for y
				}// for x
			}// for w
		}// for v
output: 
		if (found){
			printf("%c%c%c%c%c\n", letters[v], letters[w], letters[x], letters[y], letters[z]);
		} else {
			printf("no solution\n");
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值