程序设计实习(II):算法设计 14_枚举.pptxVIP

  • 2
  • 0
  • 约6.6千字
  • 约 52页
  • 2018-01-30 发布于浙江
  • 举报

程序设计实习(II):算法设计 14_枚举.pptx

程序设计实习(II):算法设计 14_枚举

程序设计实习(II):算法设计 第二讲 枚举;内容提要;枚举;枚举的思想:猜测;5;中国古代的枚举问题;POJ1222 熄灯问题;在下图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。;输入: 第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。 输出: 对每个案例,首先输出一行,输出字符串“PUZZLE #m”,其中m是该案例的序号。 接着按照该案例的输入格式输出5行,其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。每个数字以一个空格隔开。;样例输入 2 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0 ;解题思路(1);解题思路(2);解题思路(3);解题思路(4);具体实现; anSwitch[0]里放着第1行开关的状态,如何进行枚举呢? 可以使用六重循环: for( int a0 = 0; a0 2; a0 ++ ) for( int a1 = 0; a1 2; a0 ++ ) for( int a2 = 0; a2 2; a0 ++ ) for( int a3 = 0; a3 2; a0 ++ ) for( int a4 = 0; a4 2; a0 ++ ) for( int a5 = 0; a5 2; a0 ++ ) { anSwitch[0][0] = a0; anSwitch[0][1] = a1; anSwitch[0][2] = a2; …… };17;18;程序代码;void enumate() { int c; bool success; for ( c=1; c7; c++) press[1][c] = 0; while(guess()==false){ press[1][1]++; c = 1; while ( press[1][c] 1 ) { press[1][c] = 0; c++; press[1][c]++; } } return; };int main() { int cases, i, r, c; scanf(%d, cases); for ( r=0; r6; r++ ) press[r][0] = press[r][7] = 0; for ( c=1; r7; r++ ) press[0][c] = 0; for (i=0; icases; i++){ for(r=1; r6; r++) for(c=1; c7; c++) scanf(%d, puzzle[r][c]); enumate(); printf(PUZZLE #%d\n, i+1); for(r=1;r6;r++){ for(c=1;c7;c++) printf(%d ,press[r][c]); printf(\n); } } return 0; };22;实现方案二;定义一个通用的枚举类;要写一个从二进制数到状态的转换函数: void SwitchStatus( int n); 该函数将整数n( 0 =n64)的二进制表示形式对应到数组pSwitch里去 ( anSwitch[0][i] 对应第i位) template class T, int varRow, int varCol void CLightT, varRow, varCol::SwitchStatus( int n){ for(int i = 0;i varCol ;i ++ ) pSwitch[0][i] = (n i ) 1; };推测验证过程;template class T, int varRow, int varCol void CLightT, varRow, varCol::ApplySwitch( int ncurRaw) { for( int i = 0;i varCol; i++ ) { //依次让每个开关起作用 if( pSwitch[ncurRaw][i] ) { //开关左边的灯改变状态 if( i 0 ) pLights[ncurRaw][i-1]

文档评论(0)

1亿VIP精品文档

相关文档