读书人

组合算法征求-输出一个状态空间的所有

发布时间: 2012-02-22 19:36:55 作者: rapoo

组合算法征求-输出一个状态空间的所有状态
问题:设E={(x1,x2,...,xn)|xi属于Si,i=1,2,...,n}为一个状态空间,xi的定义域为Si,Si为一个有限集。设计一个算法,输出E中的所有状态。
例如,设E={(x1,x2,x3)|xi属于Si,i=1,2,3},S1={a,b,c},S2={c,d},S3={e,f},则E中的所有状态E={(a,c,e),(a,c,f),(a,d,e),(a,d,f),(b,c,e),(b,c,f),(b,d,e),(b,d,f),(c,c,e),(c,c,f),(c,d,e),(c,d,f)}.

[解决办法]
simple~
先给个JAVA代码吧,如果有需要,也可以写个C的

/**
*迭代给出所有状态,需要JRE1.5
*@author : Eastsun <http://eastsun.javaeye.com>
*@version: 1.0 2007/5/14
*/
import java.util.*;
public class ListExp{
public static void main(String[] args){
ExprIter ei =new ExprIter(new String[]{ "abc ", "cd ", "ef "});
Iterator <String> iter =ei.iterator();
int count =0;
while(iter.hasNext()){
count++;
System.out.print(iter.next()+ " , "); //打印出所有状态
if(count%10==0) System.out.println();
}
}
}

class ExprIter implements Iterable <String> {
private String[] strs;
private int[] lens;
public ExprIter(String[] strs){
this.strs =new String[strs.length];
this.lens =new int[strs.length];
for(int index=0;index <strs.length;index++){
this.strs[index] =strs[index];
this.lens[index] =strs[index].length();
}
}
public Iterator <String> iterator(){
return new ExprIterator();
}
private class ExprIterator implements Iterator <String> {
private int[] counts =new int[strs.length];
private boolean end =false;
public boolean hasNext(){
return (!end);
}
public String next(){
if(end) throw new NoSuchElementException();
StringBuilder sb =new StringBuilder(2*strs.length+1);
sb.append( '( ');
sb.append(strs[0].charAt(counts[0]));
for(int index=1;index <strs.length;index++){
sb.append( ', ');
sb.append(strs[index].charAt(counts[index]));
}
sb.append( ') ');
int index =strs.length-1;
while(index> =0){
counts[index]++;
if(counts[index]> =lens[index]){
counts[index] =0;
index --;
}
else break;
}
if(index <0) end =true;
return sb.toString();
}
public void remove(){
throw new UnsupportedOperationException();
}
}
}


(a,c,e) ,(a,c,f) ,(a,d,e) ,(a,d,f) ,(b,c,e) ,(b,c,f) ,(b,d,e) ,(b,d,f) ,(c,c,e) ,(c,c,f) ,
(c,d,e) ,(c,d,f) ,



[解决办法]
JAVA的写的稍微复杂了点,来个C的

#include <stdio.h>
#include <conio.h>
#define MAX 100
char *set[] ={ "abc ", "cd ", "ef "};
int length[] ={3,2,2};
void listAllState(char* range[],int len[],int size){
int c[MAX];
int index,count;
for(index =0;index <size;index++) c[index] =0;
count =0;
while(1){
count++;
printf( "( ");
for(index=0;index <size;index++) printf((index? ",%c ": "%c "),range[index][c[index]]);
printf( ") ");
printf(count%10? " , ": "\n ");
for(index=0;index <size;index++){


c[index]++;
if(c[index] <len[index]) break;
else c[index] =0;
}
if(index> =size) break;
}
}
int main(){
listAllState(set,length,3);
getchar();
}

读书人网 >软件架构设计

热点推荐