生活随笔
收集整理的這篇文章主要介紹了
回炉-熄灯问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
進來突然意識到算法的重要性,可惜已經沒有充足的時間去進行專業的訓練了,只能慢慢擠時間做幾個題練習一下聊以安慰,希望能多堅持幾天吧,奉勸各位想學算法的同學一定要趁早啊。
poj1222
解析見郭煒老師的程序設計與算法(二)算法基礎
熄燈問題
代碼如下
#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;
}
主要思想為枚舉思想,靈活的運用了位運算,可以說非常精煉,希望日后我的算法能力也能到如此水平 Fighting ^-^
總結
以上是生活随笔為你收集整理的回炉-熄灯问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。