蓝桥杯 算法提高 开灯游戏
来源:互联网 发布:订单号生成算法 编辑:程序博客网 时间:2024/06/04 23:28
回溯加判断,注意在改变灯的状态的时候要用引用,要不然灯的值不会发生改变
然后在每次判断输出完之后要清空一下灯的状态否则会出错
#include <iostream>#include <memory.h>using namespace std;int k[10];int d[10];void change(int &i){ //使用引用,改变灯的状态if(i==0)i=1;else if(i==1)i=0;}void judge(){for(int i=1;i<=9;i++){if(k[i]==1){if(i==1){change(d[2]);change(d[4]);}else if(i==2){change(d[1]);change(d[3]);change(d[5]);}else if(i==3){change(d[2]);change(d[6]);}else if(i==4){change(d[1]);change(d[5]);change(d[7]);}else if(i==5){change(d[2]);change(d[4]);change(d[6]);change(d[8]);}else if(i==6){change(d[3]);change(d[5]);change(d[9]);}else if(i==7){change(d[4]);change(d[8]);}else if(i==8){change(d[5]);change(d[7]);change(d[9]);}else if(i==9){change(d[6]);change(d[8]);}}}int sum=0;for(int i=1;i<=9;i++){if(d[i])sum++;}int flag=0;if(sum==4){flag=1;for(int i=1;i<=9;i++)cout<<k[i];}if(flag)cout<<endl;}void dfs(int s){if(s==10){judge();memset(d,0,sizeof(d)); //将灯全部关闭使得下一次进行判断时不会出错return ;}for(int i=0;i<2;i++){k[s]=i;dfs(s+1);}}int main(){memset(k,0,sizeof(k));memset(d,0,sizeof(d));dfs(1);return 0; }
阅读全文