程序设计实习第五讲枚举内容摘要:

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。 …… } //如果每行灯很多,或每行开关数目是可变数 N那怎么办 ? 适用于一行有 N个开关的办法 : 一个 6位二进制数的所有取值正好是 64种, 让该数的每一位对应于 anSwitch[0]里的一个元素 ( anSwitch[0][5] 对应最高位, anSwitch[0][4]对应次高位 ….. ) ,那么这个二进制数的每个取值正好表示了第一行开关的一种状态。 (如果一行有 N个开关,那么就用一个 N位二进制数) 比如, 0 的二进制表示形式是 00 0000,即代表所有开关都不按下 63 的二进制表示形式是 11 1111,即代表所有开关都按下 5 的二进制表示形式是 00 00101,即代表右数第 1, 3个开关按下 要写一个从二进制数到状态的转换函数: void SwitchStatus( int n, int * pSwitchLine)。 该函数将整数 n( 0 =n64)的二进制表示形式对应到数组pSwitchLine里去 ( pSwitchLIne [i] 对应第 i位 ) void SwitchStatus( int n, int * pSwitch) { for( i = 0。 i 6。 i ++ ) pSwitch[i] = (n i ) amp。 1。 } 要写一个让开关起作用的函数 void ApplySwitch( int * pLights, int * pNextLights, int * pSwitchs)。 pSwitchs 表示一行开关的状态 pLights 表示与开关同一行的灯的状态 pNextLights表示开关起作用后下一行的灯的状态 本函数根据 pSwitchs 所代表的开关状态,计算这行开关起作用后, pLights行和 pNextLights行的灯的状态 不考虑开关的上一行的灯,是因为设定 pSwitchs的值的时候,已经确保会使得上一行的灯变成全灭(或没有上一行) void ApplySwitch( int * pLights, int * pNextLights, int * pSwitchs) { for( int i = 0。 i 6。 i ++ ) { //依次让每个开关起作用 if( pSwitchs[i] ) {//第 i个开关按下 //开关左边的灯改变状态 if( i 0 ) pLights[i1] = 1 pLights[i1]。 //开关所在位置的灯改变状态 pLights[i] = 1 pLights[i]。 //开关右边的灯改变状态 if( i 5) pLights[i+1] = 1 pLights[i+1]。 //开关下边的灯改变状态 pNextLights[i] = 1 pNextLights[i]。 } } } include include include iostream using namespace std。 int T。 int anPuzzle[6][6]。 int anOriPuzzle[6][6]。 int anSwitch[6][6]。 //开关状态 int i,j。 void OutputResult(int t) //输出结果 { cout PUZZLE t endl。 for( int i = 0。 i 5。 i ++ ) { for( int j = 0。 j 6。 j ++ ) { cout anSwitch[i][j]。 if( j 5 ) cout。 } cout endl。 } } int main() { cin T。 for( int t = 0。 t T。 t ++ ) { for( i = 0。 i 5。 i ++ ) for( j = 0。 j 6。 j ++ ) cin anOriPuzzle[i][j]。 for( int n = 0。 n 64。 n ++ ) { //遍历首行开关的 64种状态 memcpy( anPuzzle,anOriPuzzle,sizeof(anPuzzle))。 //算出 n所代表的开关状态,放到 anSwitch[0] SwitchStatus( n, anSwitch[0])。 //下面逐行让开关起作用,并算出下一行开关应该是什么状态,再让它们起作用 …… for( int k = 0。 k 5。 k ++ ) { //算出第 k行开关起作用后的结果 ApplySwitch( anPuzzle[k], anPuzzle[k+1],anSwitch[k])。 //第 k+1行的开关状态应和第 k行的灯状态一致 memcpy( anSwitch[k+1], anPuzzle[k],sizeof(anPuzzle[k]))。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。