亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關燈游戲 Lights out (三)(線性代數+高斯消元,搜索全部解)

2019-11-11 07:08:27
字體:
來源:轉載
供稿:網友

        關燈游戲和線性代數聯系緊密,對于一個 的燈陣,用線性方程組+高斯消元法求解,時間復雜度為O(m×n)^3。相對于首行枚舉算法復雜度O(2^n) ,線代算法的時間復雜度低很多。用線性代數求解關燈游戲是個很不錯的選擇。

        本文用最通俗的語言介紹線代求解關燈游戲原理。由于解釋通俗化,細節之處難以嚴謹表述,說得不好的地方,請大神輕拍。

線性方程組求解關燈游戲的原理

問題:

        一個2×2燈陣,初始局面右下方3盞燈亮,左上角一盞燈不亮,如下圖所示。請用線性代數求解,找到可以使得所有燈都熄滅的開關操作。

解:

 %20 %20 %20 %20我們對四盞燈的開/關操作分別記為%20x1、x2%20、x3%20、x4%20,如下圖所示:

       我們用1代表操作,用0代表未操作,即 的取值為0或1。對四盞燈的亮/滅狀態分別記為 L1、L2 、L3 、L4 ,如下圖所示:

       我們用1代表亮著的燈,用0代表熄滅的燈,根據局面的初始狀態,很顯然有

接下來觀察局面,

能影響L1燈的亮/滅狀態的操作只有 x1、x2 、x3 ;

能影響L2燈的亮/滅狀態的操作只有 x1、x2 、x4 ;

能影響L3燈的亮/滅狀態的操作只有 x1、x3 、x4 ;

能影響L4燈的亮/滅狀態的操作只有 x2、x3 、x4 ;

定理1:對同一盞燈開/關操作偶數次,等于操作0次;對同一盞燈操作奇數次,等于操作1次。

所以我們將 x1、x2、x3、x4 及其系取值限定在0或者1兩個數值,以后不再說明(不怕蛋疼的話,可以對操作次數不限定,這樣一來將有無窮多個解,這些解都是在基礎解上對每盞燈再重復操作偶數次,本質上相同)。

        假如一開始所有燈都熄滅,并且假設將 x1、x2、x3、x4 全體操作一遍后,燈陣的亮/滅狀態為當前狀態。根據定理1,那么將 x1、x2、x3、x4 全體操作一遍,燈陣就又回到全熄滅狀態。x1、x2、x3、x4 就是我們想要的答案,于是列方程組:

       游戲問題轉換成了求解方程組問題。上面方程組不難求解,用初中的知識足夠了。有一點要注意,方程組是在二元域{0,1}內求解,也就是運算過程中,所有數值的取值范圍都只能是0或者1。二元域運算規則和常規運算規則有所不同,具體如下(不要問我二元域運算規則為什么是這樣的,要問就問什么是燈?或者燈為什么會亮?之類的問題):

加法:0+0=0,0+1=1,1+0=1,1+1=0

減法:0-0=0,0-1=1,1-0=1,1-1=0

乘法:0×0=0,0×1=0,1×0=0,1×1=1

除法:0/0=無意義,0/1=0,1/0=無意義,1/1=1

        注:有限域上的運算符號并不是上面那個樣子,而是一些圈、叉之類的奇怪符號。這里一方面不方便打出這些符號,另一方面也為了讓讀者便于理解,所以仍舊采用“+、-、×、/”形式。我們看到,加減法都等價于二進制位運算中的“亦或”運算;乘法等價于二進制位運算中的“與”運算;除法在這里用不到,直接無視。

方程組求解結果為:

        這是方程組唯一的解,所以這個游戲局面解法是唯一的,標記在游戲局面見下圖:

        到這里,線代原理就介紹完畢了。怎么樣,線代解法原理很簡單吧,無非就是求解線性方程組問題。而計算機求解線性方程組,我們在增廣矩陣中用高斯消元法,時間復雜度為O(m×n)^3,判斷游戲有沒有解,可以用矩陣的秩來判斷方程組有沒有解,有多少個解。

用線性代數搜索所有解法的C/C++代碼如下:

#include<iostream>using namespace std;int Row,Column,MAXN;void init(int **matrix)                                            //初始化系數矩陣{	int i,j,k;	for(i=0; i<Row; i++)		for(j=0; j<Column; j++)		{			k=i*Column+j;			matrix[k][k]=1;			if(i>0)matrix[(i-1)*Column+j][k]=1;			if(i<Row-1)matrix[(i+1)*Column+j][k]=1;			if(j>0)matrix[i*Column+j-1][k]=1;			if(j<Column-1)matrix[i*Column+j+1][k]=1;		}}void  Gauss(int **matrix,int *solution)                            //高斯消元{	int i,j,k,x,y=0,rand_coefficient,rand_matrix,rank1,rank2,inc=0;	for(k=0; k<MAXN&&y<MAXN; k++,y++)                          //增廣矩陣轉換為階梯矩陣	{		x=k;		for(i=k+1; i<MAXN; i++)			if(matrix[i][y]>matrix[x][y])x=i;		if(x-k)                                            //交換矩陣行數據			for(j=y; j<MAXN+1; j++)			{				matrix[k][j]=matrix[k][j]^matrix[x][j];				matrix[x][j]=matrix[k][j]^matrix[x][j];				matrix[k][j]=matrix[k][j]^matrix[x][j];			}		if(matrix[k][y]==0)		{			k--;			continue;		}		for(i=k+1; i<MAXN; i++)                             //消元			if(matrix[i][y])				for(j=y; j<MAXN+1; j++)matrix[i][j]^=matrix[k][j];	}	for(rand_coefficient=rand_matrix=i=0; i<MAXN; i++)          //計算系數矩陣的秩和增廣矩陣的秩	{		for(rank1=rank2=j=0; j<=MAXN; j++)		{			if(j<MAXN)rank1|=matrix[i][j];			rank2|=matrix[i][j];		}		rand_coefficient+=rank1;		rand_matrix+=rank2;	}	if(rand_coefficient<rand_matrix)                            //系數矩陣秩小于增廣矩陣秩,局面無解		cout<<"此局面無解!/n/n";	else                                                        //枚舉并回代求解	{		for(k=1<<(MAXN-rand_coefficient); k>0; k--)		{			for(i=MAXN-1; i>rand_coefficient; i--)			{				matrix[i-1][MAXN]+=matrix[i][MAXN]>>1;				matrix[i][MAXN]&=1;			}			for(i=0; i<MAXN; i++)solution[i]=matrix[i][MAXN];			for(i=MAXN-1; i>=0; i--)                    //回代				for(j=i-1; j>=0; j--)					if(matrix[j][i])solution[j]^=solution[i];			for(i=0; i<MAXN; i++)                       //輸出答案				(i%Column)?cout<<solution[i]<<" ":cout<<endl<<solution[i]<<" ";			inc++;                                      //解數量計數器			PRintf("/n");			matrix[MAXN-1][MAXN]++;		}		cout<<"/n共計"<<inc<<"個解/n";	}}int main(void){	int i,j;	char C;	cout<<"/n                    關燈游戲(Lights out)解題程序(線代解法)/n";	cout<<"請輸入行數:";	cin>>Row;	cout<<"請輸入列數:";	cin>>Column;	MAXN=Column*Row;	int **matrix=new int*[MAXN+4];                            //增廣矩陣,二維數組	for(i=0; i<MAXN+4; i++)matrix[i]=new int [MAXN+4];	int *solution=new int[MAXN+2];                            //解數組	for(i=0; i<MAXN+4; i++)		for(j=0; j<MAXN+4; j++)matrix[i][j]=0;	init(matrix);                                             //初始化系數矩陣	cout<<"請選擇,是否輸入指定初始局面?(Y/N):",cin>>C;	if((C=='Y')||(C=='y'))	{		cout<<"請輸入初始局面(1代表亮燈,0代表滅燈,燈與燈之間用空格隔開,換行用回車):/n";		for(i=0; i<MAXN; i++)cin>>matrix[i][MAXN];	}	else for(i=0; i<MAXN; i++)matrix[i][MAXN]=1;              //默認初始化局面為燈全亮  	Gauss(matrix,solution);	for(int i=0; i<MAXN+4; i++)delete []matrix[i];	delete []matrix;	delete []solution;	cout<<"/n/n求解完畢,請按任意鍵退出程序。";	cin.ignore(),cin.ignore();                                //暫停顯示	return 0;}    上面代碼可以搜索任意局面的全部解,允許用戶輸入任意初始局面,已經非常方便使用了。如果還覺得使用上面代碼太麻煩,筆者將其制作成軟件,截圖如下:

軟件在這里下載:關燈游戲解題程序1.0版 https://pan.baidu.com/s/1geNMxcZ


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
麻豆乱码国产一区二区三区| 91av视频在线免费观看| 欧美精品在线第一页| 一本一道久久a久久精品逆3p| 狠狠色狠狠色综合日日小说| 欧美激情极品视频| 欧美一级淫片aaaaaaa视频| 亚洲www在线| 国产精品电影网站| 欧美肥臀大乳一区二区免费视频| 亚洲精品v欧美精品v日韩精品| 国产精品日韩精品| 激情久久av一区av二区av三区| 最新69国产成人精品视频免费| 57pao成人永久免费视频| 97国产在线视频| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕综合一区| 一区二区三区美女xx视频| 亚洲最大的网站| 久久精品国产亚洲7777| 成人精品久久久| 亚洲国产精品久久久久久| 日韩av免费网站| 国产98色在线| 亚洲精品久久久久国产| 91久久精品国产| 欧美精品xxx| 久久成年人免费电影| 怡红院精品视频| 亚洲女人天堂av| 久久久久女教师免费一区| 中文字幕一区日韩电影| 日韩在线中文字幕| www.亚洲一区| 成人国产精品日本在线| 88xx成人精品| 精品国产一区久久久| 国产一区私人高清影院| 欧美日韩性生活视频| 亚洲综合日韩中文字幕v在线| 亚洲国产日韩精品在线| 国产精品久久久久77777| 日韩在线观看免费全集电视剧网站| 成人免费淫片aa视频免费| 成人av色在线观看| 另类图片亚洲另类| 欧美成aaa人片在线观看蜜臀| 成人精品一区二区三区电影免费| 国产综合在线观看视频| 成人精品aaaa网站| 久久亚洲精品视频| 久久伊人色综合| 国产91网红主播在线观看| 国产精品久久久久久久久久小说| 亚洲风情亚aⅴ在线发布| 91精品久久久久久| 日本精品久久久久影院| 自拍偷拍亚洲一区| 亚洲国产精品热久久| 国产一区玩具在线观看| 欧美一级淫片丝袜脚交| 亚洲精选一区二区| 欧美激情手机在线视频| 亚洲美女又黄又爽在线观看| 国产亚洲一区二区在线| 欧美日韩亚洲国产一区| 午夜精品久久17c| 92裸体在线视频网站| 秋霞av国产精品一区| 中文字幕亚洲无线码在线一区| 久久天天躁狠狠躁夜夜躁| 欧美性生交大片免网| 久久91精品国产91久久久| 亚洲欧美日韩一区二区三区在线| 久久久在线观看| 精品久久久久久中文字幕| 久久久免费精品| 日韩动漫免费观看电视剧高清| 日韩av在线免费| 国产精品久久久久久久app| 久久久精品在线观看| 97精品国产91久久久久久| 亚洲午夜久久久影院| 久久国产精品影视| 久久久精品视频在线观看| 成人性生交大片免费看视频直播| 久久精品99无色码中文字幕| 欧美高清在线视频观看不卡| 一本色道久久88亚洲综合88| 精品视频—区二区三区免费| 亚洲国产精品成人va在线观看| 欧美性在线观看| 美日韩丰满少妇在线观看| 一道本无吗dⅴd在线播放一区| 欧美与黑人午夜性猛交久久久| 国产婷婷成人久久av免费高清| 欧美第一淫aaasss性| 久久久久久亚洲精品| 狠狠色狠色综合曰曰| 日本在线观看天堂男亚洲| 久久偷看各类女兵18女厕嘘嘘| 欧美孕妇毛茸茸xxxx| 精品国产老师黑色丝袜高跟鞋| 亚洲精品第一国产综合精品| 精品视频在线播放免| 欧洲中文字幕国产精品| 欧美精品一区在线播放| 国产精品久久久久久中文字| 日韩精品在线视频观看| xvideos成人免费中文版| 最近中文字幕mv在线一区二区三区四区| 国产精品永久免费视频| 欧美一级片一区| 日韩一级黄色av| 国产精欧美一区二区三区| 91热福利电影| 欧美日韩国产一区二区三区| 中文字幕av一区二区三区谷原希美| 亚洲激情电影中文字幕| 91影院在线免费观看视频| 国产精品美女主播在线观看纯欲| 久久久久久久电影一区| 亚洲国产精品va在线看黑人动漫| 日韩在线国产精品| 精品国产福利视频| 久久精品电影网站| 日韩电影中文字幕在线| 国产亚洲人成a一在线v站| 亚洲精品电影在线| 精品香蕉一区二区三区| 日韩黄在线观看| 欧美黄色片在线观看| 国产精品福利网| 久久久影视精品| 久久亚洲综合国产精品99麻豆精品福利| 久久影院资源网| 亚洲免费高清视频| 欧美色道久久88综合亚洲精品| 日韩精品在线观看一区| 久久中文精品视频| 国产亚洲精品高潮| 91亚洲精品久久久久久久久久久久| 欧美性黄网官网| 91丨九色丨国产在线| 国产主播精品在线| 精品一区二区亚洲| 亚洲第一中文字幕在线观看| 红桃视频成人在线观看| 亚洲精品一区中文| 日本精品久久久久影院| 尤物九九久久国产精品的分类| 久色乳综合思思在线视频| 欧美做受高潮电影o| 欧美成人在线影院| 久久成人精品视频| 国产日韩亚洲欧美| 亚洲人成网站999久久久综合| 亚洲人成网站在线播| 国产一区二区三区毛片| 欧美日韩国产精品| 久久中文精品视频| 福利一区福利二区微拍刺激| 91青草视频久久|