生活随笔
收集整理的這篇文章主要介紹了
回炉-熄灯问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
進(jìn)來突然意識到算法的重要性,可惜已經(jīng)沒有充足的時間去進(jìn)行專業(yè)的訓(xùn)練了,只能慢慢擠時間做幾個題練習(xí)一下聊以安慰,希望能多堅(jiān)持幾天吧,奉勸各位想學(xué)算法的同學(xué)一定要趁早啊。
poj1222
解析見郭煒老師的程序設(shè)計與算法(二)算法基礎(chǔ)
熄燈問題
代碼如下
#include <iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char oriLights[
5];
char Light[
5];
char result[
5];
int GetBit(
char c ,
int i)
{
return (c>>i)&
1;
}
void SetBit(
char &c,
int i,
int v)
{
if(v){c |=(
1<<i);}
elsec &= ~(
1<<i);
}
void FlipBit(
char & c ,
int i)
{c^=(
1<<i);
}
void OutputResult(
int t,
char result[])
{
cout<<
"PUZZLE #"<<t<<endl;
for(
int i=
0;i<
5;i++){
for(
int j=
0;j<
6;j++){
cout<<GetBit(result[i],j);
if(j<
5)
cout<<
" ";}
cout<<endl;}
}
int main()
{
int T;
cin>>T;
for(
int t=
0;t<T;t++){
for(
int i=
0;i<
5;i++)
for(
int j=
0;j<
6;j++){
int s;
cin>>s;SetBit(oriLights[i],j,s);}
for(
int n=
0;n<
64;n++){
int switchs = n;
memcpy(Light,oriLights,
sizeof(oriLights));
for(
int i =
0;i<
5;i++){result[i] = switchs;
for(
int j=
0;j<
6;j++){
if(GetBit(switchs,j)){
if(j>
0)FlipBit(Light[i],j-
1);FlipBit(Light[i],j);
if(j<
5)FlipBit(Light[i],j+
1);}}
if(i<
4)Light[i+
1] ^=switchs;switchs = Light[i];}
if(Light[
4] ==
0){OutputResult(t,result);
break;}}}
return 0;
}
主要思想為枚舉思想,靈活的運(yùn)用了位運(yùn)算,可以說非常精煉,希望日后我的算法能力也能到如此水平 Fighting ^-^
總結(jié)
以上是生活随笔為你收集整理的回炉-熄灯问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。