洛谷——P2040 打開所有的燈
阿新 • • 發佈:2017-10-15
水題 有一個 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(intj=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 打開所有的燈