1. 程式人生 > >洛谷——P2040 打開所有的燈

洛谷——P2040 打開所有的燈

水題 有一個 cnblogs 初始 for spa %d 一個空格 string

P2040 打開所有的燈

題目背景

pmshz在玩一個益(ruo)智(zhi)的小遊戲,目的是打開九盞燈所有的燈,這樣的遊戲難倒了pmshz。。。

題目描述

這個燈很奇(fan)怪(ren),點一下就會將這個燈和其周圍四盞燈的開關狀態全部改變。現在你的任務就是就是告訴pmshz要全部打開這些燈。

例如 0 1 1

1 0 0

1 0 1

點一下最中間的燈【2,2】就變成了

0 0 1

0 1 1

1 1 1

再點一下左上角的燈【1,1】就變成了

1 1 1

1 1 1

1 1 1

達成目標。最少需要2步。

輸出2即可。

輸入輸出格式

輸入格式:

九個數字,3*3的格式輸入,每兩個數字中間只有一個空格,表示燈初始的開關狀態。(0表示關,1表示開)

輸出格式:

1個整數,表示最少打開所有燈所需要的步數。

輸入輸出樣例

輸入樣例#1:
0  1  1
1  0  0
1  0  1
輸出樣例#1:
2

說明

這個題水不水,就看你怎麽考慮了。。。。

大水題、、

少寫了個等號,找了半天

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int ans=0x7fffffff; int vis[5][5],vist[5][5]; int xx[5]={0,0,0,-1,1},yy[5]={0,1,-1,0,0}; int pd() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) if(!vis[i][j]) return false; return true; } void dfs(int x) { if(x>9) return ; for(int i=1;i<=3;i++) for(int
j=1;j<=3;j++) if(vist[i][j]==0) { vist[i][j]=1; for(int k=0;k<=4;k++) vis[i+xx[k]][j+yy[k]]=1-vis[i+xx[k]][j+yy[k]]; if(pd()) ans=min(ans,x); dfs(x+1); vist[i][j]=0; for(int k=0;k<=4;k++) vis[i+xx[k]][j+yy[k]]=1-vis[i+xx[k]][j+yy[k]]; } } int main() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>vis[i][j]; if(pd()) ans=0; else dfs(1); printf("%d",ans); return 0; }

洛谷——P2040 打開所有的燈