zoukankan      html  css  js  c++  java
  • 熄灯问题

      问题描述:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。 在矩阵角上的按钮改变3盏灯的状态 在矩阵边上的按钮改变4盏灯的状态 其他的按钮改变5盏灯的状态

    Input

      第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。

    Output

      对每个案例,首先输出一行,输出字符串“PUZZLE #m”,其中m是该案例的序号。接着按照该案例的输入格式输出5行,其中的1表示需要把对应的按钮按下,0则表示不需要按对应的按钮。每个数字以一个空格隔开。

    View Code
    #include<stdio.h>
    int a[5][6];
    int b[5][6];
    int ans[5][6];
    int dx[]={0,0,1,-1,};
    int dy[]={1,-1,0,0};
    void change(int x,int y)
    {
     b[x][y]=1-b[x][y];
     int i;
     int xx,yy;
     for(i=0;i<4;i++)
     {
     xx=x+dx[i];
     yy=y+dy[i];
     if(xx>=0&&xx<5&&yy>=0&&yy<6) b[xx][yy]=1-b[xx][yy];
     }
    }
    int check(int m)
    {
     int i,j,k=m;
     for(i=0;i<5;i++)
     {
     for(j=0;j<6;j++)
     {
     b[i][j]=a[i][j];
     ans[i][j]=0;
     }
     }
     for(i=0;i<6;i++)
     {
     ans[0][i]=k%2;
     k/=2;
     if(ans[0][i]) change(0,i);
     }
     for(i=1;i<5;i++)
     {
     for(j=0;j<6;j++)
     {
     if(b[i-1][j])
     {
     ans[i][j]=1;
     change(i,j);
     }
     }
     }
     for(i=0;i<6;i++)
     {
     if(b[4][i]) return 0;
     }
     return 1;
    }
    int main()
    {
     int n,i,j;
     int t=1;
     scanf("%d",&n);
     while(n--)
     {
    for(i=0;i<5;i++)
     {
     for(j=0;j<6;j++)
     {
     scanf("%d",&a[i][j]);
     }
     }
     for(i=0;i<64;i++)
     {
     if(check(i)) break;
     }
     printf("PUZZLE #%d\n",t++);
     for(i=0;i<5;i++)
     {
     printf("%d",ans[i][0]);
     for(j=1;j<6;j++) printf(" %d",ans[i][j]);
     printf("\n");
     }
     }
    }
  • 相关阅读:
    学习DButils笔记
    ubuntu16.04 backup and restore
    Oracle 中 编写 function 和 procedure 的注意事项
    利用反射和JDBC元数据实现更加通用的查询方法
    Memcached
    HTML, CSS
    day35作业
    day34作业
    MySQL数据库
    并发编程
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3053325.html
Copyright © 2011-2022 走看看