5*5烦恼的关灯人 游戏游戏

求解关灯游戏的全部解 - zwhc - ITeye博客
博客分类:
关灯游戏,如果是灯全亮时,有个解。其解为
01101
01110
00111
11011
11000
进行旋转后,可以得到其它的三个解,共四个解。
这四个解,两两组合,可以得到三个不同的结果,记作 T1,T2,T3。
它们可用于得到某种局面的其它解。
比如,对于局面 F
11100
10100
11000
10001
11011
其解为 R
00111
10110
00010
01001
01100
R+T1 就相当于,在 R 的基础上,先将灯全部打开,再全部关闭。得到的值就是 F 的另外一个解。所以,每个局面,都有四个解:
R
R+T1
R+T2
R+T3
比如:
m_field
11100
10100
11000
10001
11011
找到解
m_recorder
00111
10110
00010
01001
01100
解2
10010
00011
00010
11100
11001
解3
01001
00011
11001
11100
00010
解4
11100
10110
11001
01001
10111
public class LightsOff {
// #pragma once
class CField {
// CField()
// : m_iWidth(0)
// , m_iHeight(0)
// memset(m_ivField, 0, sizeof(m_ivField));
// ~CField()
public CField() {
// m_iWidth = 5;
// m_iHeight = 5;
Create(5, 5);
public CField(int w, int h) {
// m_iWidth =
// m_iHeight =
Create(w, h);
public CField(CField fld) {
m_iWidth = fld.m_iW
m_iHeight = fld.m_iH
// memcpy(m_ivField, fld.m_ivField, sizeof(m_ivField));
memcpy(m_ivField, fld);
// for(int i=0; i&fld.m_ivField. i++)
// m_ivField[i] = fld.m_ivField[i];
// protected:
// // 空间最大32*32
// __int32 m_ivField[32];
protected int[] m_ivField = new int[32];
// public:
public void Create(int iWidth, int iHeight) {
if (iWidth & 1) {
iWidth = 1;
} else if (iWidth & 32) {
iWidth = 32;
if (iHeight & 1) {
iHeight = 1;
} else if (iHeight & 32) {
iHeight = 32;
m_iWidth = iW
m_iHeight = iH
public void Clear() {
// memset(m_ivField, 0, sizeof(m_ivField));
for (int i = 0; i & m_ivField. i++) {
m_ivField[i] = 0;
// 取得宽度
public int Width() {
return m_iW
// 取得高度
public int Height() {
return m_iH
// 是否亮灯
public boolean IsLightOn(int x, int y) {
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
return (m_ivField[y] & mask) != 0;
public void SetLight(int x, int y) {
SetLight(x, y, 2);
// 设置灯 type:0关灯,1开灯, 否则把开的灯关掉,关的灯开启
public void SetLight(int x, int y, int type) {
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
if (type == 0) {
m_ivField[y] &= ~
} else if (type == 1) {
m_ivField[y] |=
m_ivField[y] ^=
// 是否亮灯
public boolean IsLightOn(int index) {
int x = index % m_iW
int y = index / m_iW
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
return (m_ivField[y] & mask) != 0;
public void SetLightI(int index) {
SetLightI(index, 2);
// 设置灯 type:0关灯,1开灯, 否则把开的灯关掉,关的灯开启
public void SetLightI(int index, int type) {
int x = index % m_iW
int y = index / m_iW
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
if (type == 0) {
m_ivField[y] &= ~
} else if (type == 1) {
m_ivField[y] |=
m_ivField[y] ^=
void LightsOff(int x, int y) {
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
if (y & 0) {
m_ivField[y - 1] ^=
if (y & m_iHeight - 1) {
m_ivField[y + 1] ^=
if (x == 0) {
mask &&= 1;
mask &&= (x - 1);
m_ivField[y] ^= (mask & ~(-1 && m_iWidth));
void LightsOff(int index) {
int x = index % m_iW
int y = index / m_iW
if (x &= 0 && x & m_iWidth && y &= 0 && y & m_iHeight) {
if (y & 0) {
m_ivField[y - 1] ^=
if (y & m_iHeight - 1) {
m_ivField[y + 1] ^=
if (x == 0) {
mask &&= 1;
mask &&= (x - 1);
m_ivField[y] ^= (mask & ~(-1 && m_iWidth));
// void Paint(CDC * pDC, int x0, int y0, int uw = 10, int type = 0)
// // 绘制底色
// if(type == 0)
// pDC-&FillSolidRect(x0, y0, uw * m_iWidth, uw * m_iHeight, RGB(50, 50,
// // 绘制灯
// __int32 mask = 1;
// for(x = 0; x & m_iW x++)
// for(y = 0; y & m_iH y++)
// if(m_ivField[y] & mask)
// if(type == 0)
// pDC-&FillSolidRect(
// x0 + x * uw, y0 + y * uw,
// uw, uw, RGB(0, 200, 0));
// else if(type == 1)
// pDC-&Ellipse(
// x0 + x * uw + uw / 3, y0 + y * uw + uw / 3,
// x0 + x * uw + uw - uw / 3, y0 + y * uw + uw - uw / 3);
// pDC-&FillSolidRect(
// x0 + x * uw, y0 + y * uw,
// uw, uw, RGB(255, 255, 255));
// mask &&= 1;
// if(type == 0)
// // 绘制网格
// for(x = 0; x &= m_iW x++)
// pDC-&FillSolidRect(
// x0 + x * uw, y0,
// 1, uw * m_iHeight, RGB(255, 255, 255));
// for(y = 0; y &= m_iH y++)
// pDC-&FillSolidRect(
// x0, y0 + y * uw,
// uw * m_iWidth, 1, RGB(255, 255, 255));
// CField & operator = (CField & fld)
public CField opSet(CField fld) {
m_iWidth = fld.m_iW
m_iHeight = fld.m_iH
// memcpy(m_ivField, fld.m_ivField, sizeof(m_ivField));
memcpy(m_ivField, fld);
public void memcpy(int[] des, CField fld) {
for (int i = 0; i & fld.m_ivField. i++) {
m_ivField[i] = fld.m_ivField[i];
public boolean memcmp(int[] des, CField fld) {
for (int i = 0; i & fld.m_ivField. i++) {
if (m_ivField[i] != fld.m_ivField[i])
// bool operator == (CField & fld)
public boolean opEq(CField fld) {
if (m_iWidth == fld.m_iWidth && m_iHeight == fld.m_iHeight &&
// memcmp(m_ivField, fld.m_ivField, sizeof(m_ivField)) == 0)
memcmp(m_ivField, fld)) {
// CField & operator += (CField & fld)
// for(y = 0; y & m_iH y++)
// m_ivField[y] ^= fld.m_ivField[y];
// return *
CField opAdd(CField fld) {
for (y = 0; y & m_iH y++) {
m_ivField[y] ^= fld.m_ivField[y];
// CField & AndNot(CField & fld)
CField AndNot(CField fld) {
for (y = 0; y & m_iH y++) {
m_ivField[y] &= ~fld.m_ivField[y];
// bool operator *(CField &fld)
boolean opMul(CField fld) {
boolean re =
for (y = 0; y & m_iH y++) {
tmp = m_ivField[y];
tmp &= fld.m_ivField[y];
for (x = 0; x & m_iW x++, mask &&= 1) {
if ((tmp & mask) != 0) {
// void Print(FILE * fp)
void fprintf(String s) {
System.out.print(s);
void fprintf(String format, Object obj) {
if (format.equals("%c")) {
System.out.print(obj);
System.out.print(format + obj);
* 矩阵顺时针旋转 90 度
public CField rotate()
CField fld = new CField();
for (x = 0; x & m_iW x++) {
for (y = 0; y & m_iH y++) {
if( IsLightOn(x, y))
//System.out.println("359 x:" + x + " y:" + y);
fld.SetLight(m_iWidth-y-1, x, 1);
void Print(String title) {
//fprintf(title);
System.out.println(title);
void Print() {
for (y = 0; y & m_iH y++) {
for (x = 0; x & m_iW x++, mask &&= 1) {
fprintf("%c", ((m_ivField[y] & mask) != 0) ? '1' : '0');
fprintf("\n");
fprintf("\n");
void PrintInt() {
for (y = 0; y & m_iH y++) {
fprintf(Integer.toBinaryString(m_ivField[y]) + " ");
// mask = 1;
// for(x = 0; x & m_iW x++, mask &&= 1)
// //fprintf( "%c", ((m_ivField[y] & mask)!=0) ? '1' : '0');
fprintf("\n");
fprintf("\n");
class CMatrix extends CField {
// public:
// CMatrix()
// : m_matrix(NULL)
// ~CMatrix()
// Destroy();
protected CField[] m_
// public:
// // 销毁矩阵
// void Destroy()
// if(m_matrix)
// delete []m_
// m_matrix = NULL;
// m_iWidth = 0;
// m_iHeight = 0;
// 创建矩阵(iWidth, iHeight只是用来初始化CField向量用的)
public void Create(int iWidth, int iHeight) {
// Destroy();
if (iWidth & 1) {
iWidth = 1;
} else if (iWidth & 32) {
iWidth = 32;
if (iHeight & 1) {
iHeight = 1;
} else if (iHeight & 32) {
iHeight = 32;
m_iWidth = iW
m_iHeight = iH
int n = m_iWidth * m_iH
m_matrix = new CField[n];
int i = 0;
for (i = 0; i & i++) {
m_matrix[i] = new CField(m_iWidth, m_iHeight);
// m_matrix[i].Create(m_iWidth, m_iHeight);
// 置为单位矩阵
void SetAsI() {
int n = m_iWidth * m_iH
int i = 0;
for (i = 0; i & i++) {
m_matrix[i].Clear();
m_matrix[i].SetLightI(i, 1);
// 置为关灯矩阵
public void SetAsL(CField mask) {
int n = m_iWidth * m_iH
int i = 0;
for (i = 0; i & i++) {
m_matrix[i].Clear();
if (mask.IsLightOn(i) == false) {
m_matrix[i].LightsOff(i);
m_matrix[i].AndNot(mask);
// 打印矩阵
public void Print() {
int n = m_iWidth * m_iH
for (y = 0; y & y++) {
for (x = 0; x & x++) {
fprintf("%c", m_matrix[y].IsLightOn(x) ? '1' : '0');
fprintf("\n");
fprintf("\n");
// 计算逆矩阵
boolean Inverse_debug(CMatrix I) {
System.out.println("470 Inverse(CMatrix I) m_switch");
CField fldT
I.Create(m_iWidth, m_iHeight);
I.SetAsI();
System.out.println("476 I");
I.Print();
int n = m_iWidth * m_iH
boolean succ =
for (i = 0; i & i++) {
for (j = j & j++) {
if (m_matrix[j].IsLightOn(i)) {
System.out.println("485 i:" + i + " j:" + j);
if (j == n) {
if (j != i) {
System.out.println("交换行");
System.out.println("499 m_switch");
fldTmp = m_matrix[j];
m_matrix[j] = m_matrix[i];
m_matrix[i] = fldT
System.out.println("499 m_switch");
System.out.println("501 I");
I.Print();
fldTmp = I.m_matrix[j];
I.m_matrix[j] = I.m_matrix[i];
I.m_matrix[i] = fldT
System.out.println("501 I");
I.Print();
// 以第i行作为主元进行消元
for (j = 0; j & j++) {
if (j != i && m_matrix[j].IsLightOn(i)) {
System.out.println("消元");
System.out.println("514 i:" + i + " j:" + j);
// m_matrix[j] += m_matrix[i];
System.out.println("515 m_switch");
m_matrix[j].opAdd(m_matrix[i]);
System.out.println("515 m_switch");
// I.m_matrix[j] += I.m_matrix[i];
System.out.println("517 I");
I.Print();
I.m_matrix[j].opAdd(I.m_matrix[i]);
System.out.println("517 I");
I.Print();
System.out.println("523 end Inverse");
// 计算逆矩阵
boolean Inverse(CMatrix I) {
CField fldT
I.Create(m_iWidth, m_iHeight);
I.SetAsI();
int n = m_iWidth * m_iH
boolean succ =
for (i = 0; i & i++) {
for (j = j & j++) {
if (m_matrix[j].IsLightOn(i)) {
if (j == n) {
if (j != i) {
fldTmp = m_matrix[j];
m_matrix[j] = m_matrix[i];
m_matrix[i] = fldT
fldTmp = I.m_matrix[j];
I.m_matrix[j] = I.m_matrix[i];
I.m_matrix[i] = fldT
// 以第i行作为主元进行消元
for (j = 0; j & j++) {
if (j != i && m_matrix[j].IsLightOn(i)) {
// m_matrix[j] += m_matrix[i];
m_matrix[j].opAdd(m_matrix[i]);
// I.m_matrix[j] += I.m_matrix[i];
I.m_matrix[j].opAdd(I.m_matrix[i]);
// CField operator *(CField & fld)
CField opMulM(CField fld) {
CField tmp = new CField(m_iWidth, m_iHeight);
// tmp.Create(m_iWidth, m_iHeight);
int n = m_iWidth * m_iH
for (i = 0; i & i++) {
if (m_matrix[i].opMul(fld)) {
tmp.SetLightI(i);
CField opIdx(int index) {
return m_matrix[index];
// 设置大小
void SetSize(int iWidth, int iHeight) {
// int iWidth = m_cbWidth.GetCurSel() + 1;
// int iHeight = m_cbHeight.GetCurSel() + 1;
m_field = new CField(iWidth, iHeight);
// m_field.Create(iWidth, iHeight);
m_mask = m_
m_recorder = m_
int fw = m_iUnitWidth * iW
int fh = m_iUnitWidth * iH
w = fw + 128;
h = fh + 100;
if (w & 360) {
if (h & 200) {
// MoveWindow(
// (::GetSystemMetrics(SM_CXSCREEN) - w) / 2,
// (::GetSystemMetrics(SM_CYSCREEN) - h) / 2,
// GetClientRect(&rect);
// m_iX0 = 50 + (rect.Width() - fw) / 2;
// m_iY0 = 50;
// 计算求解矩阵
m_switch = new CMatrix();
m_switch.Create(iWidth, iHeight);
m_trans = new CMatrix();
m_trans.Create(iWidth, iHeight);
m_trans.SetAsI();
m_switch.SetAsL(m_mask);
m_switch.Inverse(m_trans);
System.out.println("m_switch");
m_switch.Print();
m_switch.SetAsL(m_mask);
System.out.println("m_switch");
m_switch.Print();
System.out.println("m_trans");
m_trans.Print();
// Invalidate();
private void solve() {
m_recorder = m_trans.opMulM(m_field);
if (m_switch.opMulM(m_recorder).opEq(m_field)) {
// MessageBox("找到解", "成功", MB_ICONINFORMATION);
System.out.println("找到解");
// MessageBox("未找到解", "失败", MB_ICONERROR);
System.err.println("未找到解");
m_recorder.Clear();
System.out.println("m_recorder");
m_recorder.Print();
System.out.println("m_recorder.PrintInt();");
m_recorder.PrintInt();
private void inputAllLight() {
for(int i=0; i&5; i++)
for(int j=0; j&5; j++)
m_field.SetLight(i, j, 2);
System.out.println("m_field");
m_field.Print();
* 输入的数据
private void input() {
//m_field = m_trans.m_matrix[0];
m_field.SetLight(0, 0, 1);
m_field.SetLight(0, 1, 1);
m_field.SetLight(1, 0, 1);
m_field.LightsOff(0, 0);
m_field.LightsOff(1, 0);
for(int i=0; i&5; i++)
for(int j=0; j&5; j++)
m_field.SetLight(i, j, 2);
System.out.println("m_field");
m_field.Print();
* 测试求解过程
private static void testSolve()
LightsOff lo = new LightsOff();
lo.SetSize(5, 5);
//lo.SetSize(2, 3);
lo.input();
lo.solve();
* 打印求逆矩阵的过程
private void debugInverse(int iWidth, int iHeight)
m_field = new CField(iWidth, iHeight);
m_mask = m_
m_recorder = m_
m_switch = new CMatrix();
m_switch.Create(iWidth, iHeight);
m_trans = new CMatrix();
m_trans.Create(iWidth, iHeight);
m_trans.SetAsI();
m_switch.SetAsL(m_mask);
m_switch.Inverse_debug(m_trans);
System.out.println("m_switch");
m_switch.Print();
m_switch.SetAsL(m_mask);
System.out.println("m_switch");
m_switch.Print();
System.out.println("m_trans");
m_trans.Print();
private static void testInverse()
LightsOff lo = new LightsOff();
lo.debugInverse(3,3);
* 测试矩阵旋转
private static void testRotate()
LightsOff lo = new LightsOff();
//CField f1 = lo.new CField(5,5);
CField f1 = lo.new CField(5,5);
f1.LightsOff(0, 0);
f1.LightsOff(1, 0);
f1.LightsOff(0, 1);
f1.LightsOff(0, 3);
f1.Print("f1");
CField f2 = f1.rotate();
f2.Print("f2");
CField f3 = f2.rotate();
f3.Print("f3");
CField f4 = f3.rotate();
f4.Print("f4");
private static void solveAllLight()
LightsOff lo = new LightsOff();
solveAllLight(lo);
* 求解灯全亮时的矩阵
private static void solveAllLight(LightsOff lo)
lo.SetSize(5, 5);
lo.inputAllLight();
lo.solve();
for(int i=0; i&4; i++)
lo.m_all[i] = lo.m_
lo.m_all[i] = lo.m_all[i-1].rotate();
int idx = 0;
CField[] m_all_temp = new CField[6];
for(int i=0; i&3; i++)
for(int j=i+1; j&4; j++)
m_all_temp[idx] = lo.new CField(lo.m_all[i]);
m_all_temp[idx].opAdd(lo.m_all[j]);
for(int i=0; i&4; i++)
lo.m_all[i].Print("830 m_all:" + i*90);
for(int i=0; i&3; i++)
for(int j=i+1; j&4; j++)
if(lo.m_all[i].opEq( lo.m_all[j] ))
System.out.println("lo.m_all i:" + i + " =j:" + j);
for(int i=0; i&6; i++)
m_all_temp[i].Print("835 m_all_2:" + i);
for(int i=0; i&6; i++)
boolean b =
for(int j=i-1; j&=0; j--)
if(m_all_temp[j].opEq( m_all_temp[i] ))
//System.out.println("lo.m_all_2 i:" + i + " =j:" + j);
lo.m_all_2[lo.iZh] = m_all_temp[i];
for(int i=0; i&lo.iZh; i++)
lo.m_all_2[i].Print("835 m_all_3:" + i);
* 输入的数据
private void input02() {
m_field.LightsOff(0, 0);
m_field.LightsOff(1, 0);
m_field.SetLight(0, 0, 1);
m_field.SetLight(1, 0, 1);
m_field.SetLight(2, 0, 1);
m_field.SetLight(0, 1, 1);
m_field.SetLight(2, 1, 1);
m_field.SetLight(0, 2, 1);
m_field.SetLight(1, 2, 1);
m_field.SetLight(0, 3, 1);
m_field.SetLight(4, 3, 1);
m_field.SetLight(0, 4, 1);
m_field.SetLight(1, 4, 1);
m_field.SetLight(3, 4, 1);
m_field.SetLight(4, 4, 1);
System.out.println("m_field");
m_field.Print();
* 获得所有的解
private static void getAllSolve()
LightsOff lo = new LightsOff();
solveAllLight(lo); //求解灯全亮时的特殊解,获得其两两组合
lo.SetSize(5, 5);
lo.input02();
lo.solve();
for(int i=0; i&lo.iZh; i++)
CField f = lo.new CField(lo.m_recorder);
f.opAdd(lo.m_all_2[i]);
f.Print("解" + (i+2));
* @param args
public static void main(String[] args) {
//testSolve(); //测试求解过程
//testInverse(); //打印求逆矩阵的过程
//testRotate(); //测试矩阵旋转
//solveAllLight(); //求解灯全亮时的特殊解,或得其两两组合
getAllSolve(); //测试求解过程
CMatrix m_
CMatrix m_
int m_iUnitW
CField[] m_all = new CField[4];
//四个特殊解
//CField[] m_all_temp = new CField[6];
//四个特殊解的两两组合
CField[] m_all_2 = new CField[6];
//四个特殊解的两两组合,去掉重复值
int iZh = 0; //有多少个特殊解的两两组合
下载次数: 4
浏览: 161562 次
来自: 福州
finalerboy 写道有问题的。。。而且问题多得很,你自己 ...
有问题的。。。而且问题多得很,你自己试试
for(int j ...
没有考虑中文哦,实现了三分之一
kyfxbl 写道左耳朵耗子这人感觉挺装的,发的帖子也没什么营 ...
左耳朵耗子这人感觉挺装的,发的帖子也没什么营养,我已经取消关注 ...Author : Evensgn&Blog Link :&Article Link :&&
Lights Out (关灯)是一款据说在20世纪90年代就已经被设计出的小游戏,游戏的玩法十分简单。
首先,给定一个 n 行 m 列的矩形方格阵,每个格子上都有一盏灯。
初始时,有些灯是开着的,有些灯是关着的。
玩家每次进行一次操作,选中一盏灯,点击一下它,就会将它和与它相邻的灯的状态改变,即开着的灯变为关闭,关着的灯变为开启。
最后的目的是关闭所有的灯。
这里给出一个网页版的链接:。
还有博客园一位博友DIY的一个类似的游戏,。这个蓝色拼图与 Lights Out 实质上相同,只是初始状态固定了是所有的灯都是开启的。
Lights Out 的游戏规则就是这样简单,然而到了后面的几关,方格增多,情况复杂,人工找出解法对于我来说是十分困难的。
因此,我们考虑用程序求解这个游戏。
首先我们要将这个游戏的过程转化为数学模型。
显然地,对于一个方格,会影响到它的方格只有它本身和与它相邻的 4 个方格(对于边界的方格来说,相邻的方格不足 4 个)。
并且很容易发现,每一个方格我们要么不点击,要么点击 1 次,因为点击一个方格两次及以上是没有任何意义的。每点击两次就相当于没有点击。
对于方格 i ,我们用 0 表示不点击它,用 1 表示点击它,记作 Si 。
每盏灯的状态只有开或者关,我们用 0 和 1 表示方格 i 状态,方格 i 的初始状态记为 Mi&。&
可以看出,每盏灯 i 的最终状态只与 Mi + Si + Sk1 + Sk2 + .... + Skp &(k1 ... kp 是枚举与 i 相邻的所有方格)的奇偶性有关。
既然只与奇偶性有关,我们就可以用异或运算来表示它。
也就是说,对于每盏灯 i ,我们都可以得到一个方程 & & & Mi xor Si xor Sk1 xor Sk2 xor ... xor Skp = 0 。
等式右边的 0 表示最后每盏灯的状态都是关闭的。
这个方程其实也就等价于 & & & &Si xor Sk1 xor Sk2 xor ... xor Skp = Mi 。
我们得到了 Tot 个这样的方程(Tot 是灯的数量,即 Tot = n * m),共有 Tot 个未知数(即 Tot 个 Si),就是一个异或方程组。
由于游戏给定的初始状态一定有解,所以我们是一定可以求出这个异或方程组的一组解的。
那么下面的问题就是:怎样求解异或方程组?
显然,我们要使用高斯消元来求异或方程组的解。
这个过程与使用高斯消元求解普通的线性方程组相似(如果不了解高斯消元可以看一下),只是每次在一个方程中消去一个未知数的时候,不是将这个方程乘上一个系数后与另一个方程相减,而是将这个方程的系数与另一个方程的系数进行异或运算,两个方程右边的数也要一起进行异或。
这样就可以求出 Lights Out 的解了。
代码如下,因为代码非常简单所以没有添加注释:
#include &iostream&
#include &cstdlib&
#include &cstdio&
#include &cstring&
#include &algorithm&
#include &cmath&
const int MaxL = 10 + 5, MaxN = 100 + 5;
const int Dx[5] = {0, 0, 1, -1}, Dy[5] = {1, -1, 0, 0};
int n, m, T
int A[MaxN][MaxN], Map[MaxL][MaxL], Ans[MaxL][MaxL];
inline bool Inside(int x, int y)
if (x & 0 || x &= n)
if (y & 0 || y &= m)
inline int Get_Index(int x, int y)
return x * m + y + 1;
struct Pos
inline Pos Get_Pos(int Num)
ret.x = (Num - 1) /
ret.y = ((Num % m - 1) + m) %
void Get_Equation(int x, int y)
int Id, Id2, xx,
Id = Get_Index(x, y);
for (int i = 1; i &= T ++i) A[Id][i] = 0;
A[Id][Tot + 1] = Map[x][y];
A[Id][Id] = 1;
for (int k = 0; k & 4; ++k)
xx = x + Dx[k]; yy = y + Dy[k];
if (!Inside(xx, yy))
Id2 = Get_Index(xx, yy);
A[Id][Id2] = 1;
inline void Swap(int p, int q)
for (int i = 1; i &= Tot + 1; ++i)
Temp = A[p][i];
A[p][i] = A[q][i];
A[q][i] = T
void Gauss()
for (int i = 1; i &= T ++i)
for (int j = i + 1; j &= T ++j)
if (A[Tj][i] == 0 && A[j][i] == 1)
if (A[Tj][i] == 0)
if (Tj != i) Swap(Tj, i);
for (int j = i + 1; j &= T ++j)
if (A[j][i] == 0)
for (int k = k &= Tot + 1; ++k)
A[j][k] ^= A[i][k];
for (int i = T i &= 1; --i)
Pi = Get_Pos(i);
Ans[Pi.x][Pi.y] = A[i][Tot + 1];
for (int j = i - 1; j &= 1; --j)
if (A[j][i]) A[j][Tot + 1] ^= A[i][Tot + 1];
int main()
scanf("%d%d", &n, &m);
for (int i = 0; i & ++i)
for (int j = 0; j & ++j)
scanf("%1d", &Map[i][j]);
for (int i = 0; i & ++i)
for (int j = 0; j & ++j)
Get_Equation(i, j);
printf("Solution:\n");
for (int i = 0; i & ++i)
for (int j = 0; j & ++j)
printf("%d", Ans[i][j]);
printf("\n");
阅读(...) 评论()复制地址:
小游戏,大乐趣
1.按键操作
mouseleft点击找到数字
2.如何开始
游戏加载完毕点击start game,点击play,最后点击skip即可开始游戏。
3.游戏目标
以最快的速度,找到所有图片吧!
7K7K网页游戏
7K7K儿童游戏
法律顾问:北京市诺恒律师事务所
京公网安备37
游戏作品版权归原作者享有,如无意之中侵犯了您的版权,请您按照来信告知,本网站将应您的要求删除。
7k7k小游戏温馨提示:适度游戏娱乐,沉迷游戏伤身,合理安排时间,享受快乐生活……
该游戏已收藏

参考资料

 

随机推荐