Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- using namespace std;
- struct elem{
- int state;
- int dis;
- bool operator < (const elem& rhs)const
- {
- return dis > rhs.dis;
- }
- };
- int main()
- {
- int n;
- scanf("%d",&n);
- if(n == 1){
- int x;
- scanf("%d",&x);
- printf("%d",x);
- return 0;
- }
- int state = 0;
- for(int i = n - 1 ; i >= 0 ; i --){
- int x;
- scanf("%d",&x);
- state += (1<<i)*x;
- }
- bool visited[(1<<n)];
- int dist[(1<<n)];
- for(int i = 0 ; i < (1<<n) ; i ++){
- visited[i] = false;
- dist[i] = 1e9;
- }
- dist[state] = 0;
- int ans = -1;
- queue<int> q;
- q.push(state);
- while(!q.empty()){
- int u = q.front();//.state;
- q.pop();
- if(u == 0){
- break;
- }
- for(int i = 0 ; i < n ; i ++){
- int xp;
- if(i == 0){
- xp = u xor (1<<0);
- xp = xp xor (1<<1);
- }
- else if(i == n - 1){
- xp = u xor (1<<n-1);
- xp = xp xor (1<<n-2);
- }
- else{
- xp = u xor (1<<i);
- xp = xp xor (1<<(i+1));
- xp = xp xor (1<<(i-1));
- }
- if(!visited[xp] && dist[u] + 1 < dist[xp]){
- dist[xp] = dist[u] + 1;
- q.push(xp);
- }
- }
- }
- printf("%d",(dist[0] == 1e9 ? -1 : dist[0]));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement