5x5点灯游戏的答案

来源:互联网 发布:photoshop软件mac版本 编辑:程序博客网 时间:2024/06/10 01:27

点灯游戏:点一下鼠标,十字范围内的灯会明暗变换,最后都变亮或者熄灭。曾经公司有朋友在玩,我提议用编程解答该问题,第一个解答是穷举法,现在这个更快速一些,最后的答案竟然是有些初始值没有答案!

#include <iostream>
using namespace std;

#define N 5

int puzz[32= {0-1-1-1-1-1-12335592,
                
-1-17696412-1-15690228-1-1,
                
-13290808-1-1-1-11152464-1,
                
-1-1,-146711406612428-1-1-1,}
;

void int2Matrix(int value, int matrix[N][N])
{
    
for (int i = 0; i < N; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            
int shift = i * N + j;
            matrix[i][j] 
= ((value >> shift) & 1);
        }

    }

}


int matrix2Int(int matrix[N][N])
{
    
int result = 0;
    
int binaryMulti = 1;
    
for (int i = 0; i < N; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            result 
+= matrix[i][j] * binaryMulti;
            binaryMulti 
*= 2;
        }

    }


    
return result;
}


void showMatrix(int matrix[N][N])
{
    
for (int i = 0; i < N; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            cout 
<< matrix[i][j] << " ";
        }

        cout 
<< endl;
    }

    cout 
<< endl;
}


void matrixTransform(int oldMatrix[N][N], int newMatrix[N][N])
{
    
for (int i = 0; i < N; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            
int total = oldMatrix[i][j]
                
+ oldMatrix[i - 1][j]
                
+ oldMatrix[i + 1][j]
                
+ oldMatrix[i][j - 1]
                
+ oldMatrix[i][j + 1];
            
            
if (i == 0)
            
{
                total 
-= oldMatrix[i - 1][j];
            }

            
if (i == N -1)
            
{
                total 
-= oldMatrix[i + 1][j];
            }

            
if (j == 0)
            
{
                total 
-= oldMatrix[i][j - 1];
            }

            
if (j == N - 1)
            
{
                total 
-= oldMatrix[i][j + 1];
            }

            
            newMatrix[i][j] 
= total;
        }

    }

}


void matrixUpdate(int matrix[N][N], int mathod[N][N])
{
    
for (int i = 0; i < N; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            matrix[i][j] 
= (matrix[i][j] + mathod[i][j]) % 2;
        }

    }

}


void algorithm(int matrix[N][N], int result[N][N])
{
    
int temp[N][N] = {0};
    
int temp2[N][N] = {0};
    
int n[N][N] = {0};

    
for (int i = 0; i < N - 1; i++)
    
{
        
for (int j = 0; j < N; j++)
        
{
            temp[N 
- 2 - i][j] = matrix[N - 1 - i][j];
            n[N 
- 2 - i][j] = matrix[N - 1 - i][j];
        }

        matrixTransform(temp, temp2);
        matrixUpdate(matrix, temp2);
        
for (j = 0; j < N; j++)
        
{
            temp[N 
- 2 - i][j] = 0;
        }

    }


    
int xx = matrix2Int(matrix);
    
int yy = matrix2Int(n);

    
if (puzz[xx] != -1)
    
{
        cout 
<< "Answer:" << endl;;
        
int asnwer = puzz[xx] ^ yy;
        int2Matrix(asnwer, temp);
        showMatrix(temp);
    }

    
else
    
{
        cout 
<< "No Answer!" << endl;
    }

}


int main()
{
    
int input[N][N] = {
        
1,1,1,1,1,
        
1,1,1,1,1,
        
1,1,1,1,1,
        
1,1,1,1,1,
        
0,1,1,1,0}
;
    
int result[N][N];
    
    cout 
<< "input: " << endl;
    showMatrix(input);
  
    algorithm(input, result);
    
return 0;
}
原创粉丝点击