SWERC2014 PRO A

本文分享了一段从使用Java解决简单问题的旅程,通过深入搜索算法来解决问题的过程。作者反思了代码的效率,并计划尝试C++或Java的排列方法来优化解决方案。文中详细阐述了类结构、方法实现以及输入输出处理流程。

开始记录自己码的一路。

很简单的一道题目,先用java过了一下,竟然深搜了一路。。

import java.io.*;
import java.util.*;
// SWERC + GREAT = PORTO
public class Main {
	public static void main(String[] args) throws IOException{
		Test t = new Test();
		t.traiter();
	}
}

class Test{
	BufferedReader f; 
//	PrintWriter out;
	boolean[] use = new boolean[10];
	int n, count = 0; 
	//String[] data;
	boolean[] head = new boolean[27];
	int[][] data = new int[11][11];
	long[] value = new long[11];
	int[] map = new int[27];
	void traiter() throws IOException{
	//	f = new BufferedReader(new InputStreamReader(System.in));
		f = new BufferedReader(new InputStreamReader(System.in));
		//	out = new PrintWriter(new BufferedWriter(new FileWriter("A.out")));
		// step 1 read data 
		read();
		// step 2 dfs
		
		f.close();
	//	out.close();
	}
	void dfs(int rang, int pos){
		if(rang == n && pos >= 11){
			judge();
			return;
		}
		if(pos >= 11){
			dfs(rang+1,1);
			return;
		}
		if(data[rang][pos]==0){
			dfs(rang, pos+1);
			return;
		}
		int tmp = data[rang][pos]; long cur;
		if(map[tmp]!=-1){
			cur = value[rang];
			value[rang] = value[rang]*10+map[tmp];
			dfs(rang,pos+1);
			value[rang] = cur;
			return;
		}
		for(int i = 0; i<=9; i++){
			if(i==0 && head[tmp])
				continue;
			if(use[i])
				continue;
			cur = value[rang];
			value[rang] = value[rang]*10+i;
			map[tmp] = i;
			use[i] = true;
	//		System.out.println(tmp+" go to be "+i);
			dfs(rang,pos+1);
			use[i] = false;
			map[tmp] = -1;
			value[rang] = cur;
		}
	}
	
	void judge(){
		long sum=0; 
		for(int i = 1; i<n; i++)
			sum+=value[i];
		if(sum == value[n])
			count++;
	}
	
	
	void read() throws IOException{
		String s = f.readLine();
		while(s!=null){
		//	System.out.println(s);
			n = Integer.parseInt(s);
			
			for(int i = 1; i<=n; i++){
				s = f.readLine();
				data[i][0] = s.length();
				for(int j = 0; j<s.length(); j++)
					data[i][10-j] = s.charAt(s.length()-1-j)-'A'+1;
				head[s.charAt(0)-'A'+1] = true;
			}
			Arrays.fill(map, -1);
			dfs(1,1);
			System.out.println(count);
			s = f.readLine();
			for(int i = 0; i<=n; i++){
				Arrays.fill(data[i], 0);
			}
			Arrays.fill(head, false);
			Arrays.fill(use, false);
			Arrays.fill(value, 0);
			Arrays.fill(map, -1);
			count=0;
		}
	}
}

知道自己写的烂。。想用c++或者java写个排列来做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值