vaezhenyu 2016-07-11 02:47 采纳率: 0%
浏览 1121

请帮我改改程序,点灯问题,只输出最少的哪一种解法

#include
#include
#include
#define MR 32 // 理论上这个程序可以运算的数字大于32但受无符号长整型位数限制只能构造出32*32的数组
#define MJNUM 20
typedef struct _LightMatrix
{
unsigned long mtrx[MR]; //定义无符号长整型的能到达的最大的宽度的数组
int width;
int height; //本程序中的长和宽是相等的
}LightMatrix;

void PrintLine(unsigned long line,int width)//输出一行
{
int i=0;
unsigned long mark=1;
for(i=width-1;i>=0;--i)

{
putchar((line& (mark<<i)) ?'*':'-');

}
printf("\n");

}

void ProcessRow(LightMatrix*m,int r_num,unsigned long r_mode)
{
unsigned long mask;
int i=0;
for(i=0; iwidth; ++i)
{
mask=1< if((r_mode&mask) !=0)
{
if(r_num>0) m->mtrx[r_num-1]^=mask;
if(r_num+1height) m->mtrx[r_num+1]^=mask;

        mask=mask | (mask<<1) | (mask>>1);
        m->mtrx[r_num]^=mask;
    }
}

}

void Solve(LightMatrix*m,LightMatrix** result_list) //这是求解函数
{
unsigned long i=0;
int j=0;
int total_count=(int)pow(2,m->width); //共需枚举的次数2的宽度值次方
int counter=0;

LightMatrix* result= (LightMatrix*)malloc(sizeof(LightMatrix));
result->width=m->width;
result->height=m->height;
for(i=0; i<total_count; ++i)                                            //枚举第一行的情况
{
    memset(m->mtrx,0,sizeof(m->mtrx));
    result->mtrx[0]=i;
    ProcessRow(m,0,result->mtrx[0]);                                    //处理第一行

    for(j=1; j<m->height; ++j)
    {
        result->mtrx[j]=~(m->mtrx[j-1]);                            //根据上一行处理当前行,既用下一行把不亮的灯点亮 
        ProcessRow(m,j,result->mtrx[j]);
    }

    unsigned long mark=~0ul<<m->width;                              //0UL 表示 无符号长整型 0这句话啥意思特别是   ~ 这个符号 

    if((m->mtrx[m->height-1] | mark) ==~0ul)                          //判断最后一行是否全为 1,即若是全1方案可行,否则丢弃。 
    {
        result_list[counter++]=result;                                //重新分配一个解的空间
        result= (LightMatrix*)malloc(sizeof(LightMatrix));
        result->width=m->width;
        result->height=m->height;
        if(counter+1>MJNUM) break;//解 
    }
}

}
void Solution(LightMatrix*result)

{
int i=0;
for(i=0; iheight; ++i)
{
PrintLine(result->mtrx[i],result->width);

}

}

int main(void)
{

LightMatrix m;
LightMatrix* results[MJNUM+1]={NULL};
int w=0,h=0;
int i=0;
printf("请输入你要点灯方阵的边长(小于等于32) \n");
scanf("%d", &w);
m.width=w;
m.height=w;

Solve(&m,results); 

if(results[0]!=NULL)                                //判断是否有解函数 
{            
    while(results[i]!=NULL)
    { 
        Solution(results[i]);printf("");                        //如果有解输出所有解的情况。 
        printf("            \n");
        i++;
    } printf("以上即点灯方法,一共有%d个解\n",i); 
     }

else
{
   printf("对不起,此情况无解");
}

}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2017-03-11 15:38
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘