poj 1222 EXTENDED LIGHTS OUT

来源:http://www.cnblogs.com/hxer/archive/2016/02/03/5179165.html
-Advertisement-
Play Games

EXTENDED LIGHTS OUT 題意:給一個5*6的01矩陣,對一個位置操作(0->1開燈或者1->0關燈)會影響到(包括自己)周邊燈狀態反轉。問最後要使得所有的燈關掉的操作矩陣(1表示該位置的燈操作了) 提示:01矩陣,題目給了說是操作兩次就相當於沒操作,但是還有隱含的意思就是這就是一個異


EXTENDED LIGHTS OUT

題意:給一個5*6的01矩陣,對一個位置操作(0->1開燈或者1->0關燈)會影響到(包括自己)周邊燈狀態反轉。問最後要使得所有的燈關掉的操作矩陣(1表示該位置的燈操作了)

提示:01矩陣,題目給了說是操作兩次就相當於沒操作,但是還有隱含的意思就是這就是一個異或操作(就是和mod2);對於01矩陣加上操作矩陣得到0矩陣,可知所作用的矩陣和原矩陣相同;(操作矩陣:如對(0,0)操作就相當於加上只有左上角有3個1的矩陣,但是把這個矩陣轉化為了一個維度為30的向量形式,有30棧燈所以下麵是一個30*30的矩陣)這是高斯消元列方程的基礎;

高斯消元法:最重要的是要想到構造出一個30*30的作用矩陣,第i列數字中(列號0~29表示燈的標號)1表示第i盞燈操作會影響到1所對應的行號的燈,存儲在增廣矩陣a[][]中;

所謂增廣矩陣就是抽象出只含方程組的繫數和結果的矩陣(簡化書寫)。這樣第i盞燈最終的狀態a[i][30] = Σ(a[i][j]*x[j])(0 <= j < 30)。這就是為什麼在最後化成了上三角之後怎麼是對行向量操作的原因;(a[i][j] && x[j]表示第j盞燈操作會影響到第i盞燈,並且第j盞燈是開的。還有一個前提就是a[i][i] = 1,所以x[i] = a[i][var])

註:在高斯消元列方程轉移到矩陣時,最好直接看每一個繫數與變數之間的對應關係,而不是用行向量與列向量來看。

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
int dir[2][4] = {{0,1,0,-1},{1,0,-1,0}};
int a[35][35];
int equ,var;
int x[35];
int Guass()
{
    int i,j,k,free_var = 0;
    rep0(i,0,equ){
        int mx = i;
        rep0(j,i+1,equ)
            if(abs(a[j][i]) > abs(a[mx][i]))  mx = j;
        if(a[mx][i] == 0){
            free_var++;
            continue;
        }
        if(mx != i)
            rep1(k,i,var)
                swap(a[i][k],a[mx][k]);
        rep0(j,i+1,equ){
            if(a[j][i]){    //第j盞燈也會對第i盞燈產生影響;
                rep1(k,i,var)
                    a[j][k] ^= a[i][k];
            }
        }
    }
    if(free_var != 0) return free_var;
    rep_1(i,var-1,0){
        x[i] = a[i][var];
        rep0(j,i+1,equ)
            x[i] ^= (a[i][j] && x[j]);  //第j個燈會影響到第i盞燈,同時第j盞燈也會亮。
    }
}
void init()
{
    int i,j,k;
    rep0(i,0,5)
        rep0(j,0,6){
            int x = i*6+j;
            a[x][x] = 1;
            rep0(k,0,4){
                int nx = i + dir[0][k] ,ny = j + dir[1][k];
                int pos = nx*6+ny;
                if(nx < 0 || nx >= 5 || ny < 0 || ny >= 6) continue;
                a[pos][x] = 1;  //本來是對稱的矩陣,因為影響是相互的,但是寫成[x][pos]思想就不一樣了
            }
        }
}
int main()
{
    int T,kase = 1,i;
    cin>>T;
    while(T--){
        MS0(x);MS0(a);
        rep0(i,0,30) scanf("%d",&a[i][30]);
        init();
        equ = var = 30;
        Guass();
        printf("PUZZLE #%d\n",kase++);
        rep0(i,0,30)
            printf("%d%c",x[i],(i+1)%6?' ':'\n');
    }
    return 0;
}
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 傳統ASP.NET開發 第一步:客戶端請求伺服器; 第二步:伺服器從資料庫取得數據處理後響應給客戶端頁面。 MVC的設計思想 第一步:客戶端請求控制器(裡面的一個方法); 第二步:控制器從資料庫里取得數據填充到模型裡面; 第三步:控制器把模型交給視圖; 第四步:視圖響應呈現給客戶端。
  • ES介紹 維基百科使用Elasticsearch來進行全文搜做並高亮顯示關鍵詞,以及提供search-as-you-type、did-you-mean等搜索建議功能。 英國衛報使用Elasticsearch來處理訪客日誌,以便能將公眾對不同文章的反應實時地反饋給各位編輯。 StackOverflow
  • function readyDo() {// alert(xhr.readyState + "分" + xhr.Status); if (xhr.readyState==4 && xhr.status==200 ) { var result = xhr.responseText; if (resul
  • 在Nancy中,給我們的網站換個自定義的圖標。
  • System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位於java.lang包。 由於該類的構造方法是private的,所以無法創建該類的對象,也就是無法實例化該類。其內部的成員變數和成員方法都是static的,所以也可以很方便的進行調用。 1、成員變數 System類內部包含i
  • 指定迴圈次數,使用計數器重覆運行語句,語法結構如下: 1 2 3 4 5 For counter = start To end [Step step] [statements] [Exit For] [statements] Next 主要參數: counter:用做迴圈計數器的數值變數。這個變數不
  • scrapy關於日誌文件的記錄
  • JSON字元串的最上一層,肯定是一個JSONObject,JSONObject的下一層,可以包含JSONArray,JSONArray又包含了若幹個JSONObject。用例子來說明: package myJson; import net.sf.json.JSONArray; import net.
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...