自己電腦做主機(jī)怎么做網(wǎng)站引流客戶的最快方法是什么
小小注解:
1.
vis:表示到達(dá)該狀態(tài)的步數(shù)(min)+1,?
因為我們是從開始狀態(tài) 窮舉,所以每次到一個新狀態(tài)(之前沒有到過的狀態(tài))就是最小步數(shù)。
如何判斷是否是一個新狀態(tài)呢,vis 知道,如果是新狀態(tài)?vis=0;
另外,把開始狀態(tài)設(shè)置為1,設(shè)置為 0 的話,程序就會把開始狀態(tài)當(dāng)作一個新狀態(tài),而開始狀態(tài)當(dāng)然不是一個新狀態(tài)。
11.
開: 初始:1 0 1 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?關(guān): 初始:1 0 1 0
? ? ? ? ? ?開:?1 1 0 0? ? ?(|)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 關(guān):?1 1 0 0
? ? ??? 結(jié)果:?1 1 1 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??結(jié)果: 0 0 1 0
? ? ? ? ?初始 |?開 = 結(jié)果? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ?~關(guān): 0 0 1 1? ? ?(&)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?初始 &(~?關(guān))?= 結(jié)果?
111.
開始狀態(tài)的得到:
例: n=4時;開始狀態(tài):1 1 1 1,即 (1<<n)-1 ;
注意:括號不能省,以為 1<<n-1 = 1<<(n-1);
#include<iostream>
#include<queue>
using namespace std;
int a[3300],b[3300]; //開燈 關(guān)燈 一個操作拆成兩個 分別存在 a b中
int vis[3300]; //到達(dá)該狀態(tài)的步數(shù)+1;
//對于一種狀態(tài) 1改燈開 0關(guān)
int main(){int n,m; cin>>n>>m;for(int i=0;i<m;i++)for(int j=0;j<n;j++){int x; scanf("%d",&x);a[i]<<=1; b[i]<<=1;if(x==1) b[i]++;if(x==-1) a[i]++; }queue<int>q;q.push((1<<n)-1);vis[(1<<n)-1]=1;while(q.size()){int num=q.front(); q.pop();for(int i=0;i<m;i++){int temp=num|a[i];temp=temp&(~b[i]);if(vis[temp]) continue;vis[temp]=vis[num]+1; q.push(temp);if(temp==0){printf("%d",vis[0]-1); return 0;}}}printf("-1");return 0;
}