• POJ 1753 Flip Game (bfs)


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int ch[20];
    int op[4][2]={1,0, -1,0, 0,1, 0,-1};
    int mat[200000];
    int vis[200000];
    void init_ch()
    {
        int i,j,k;
        int temp;
        int cnt=0;
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                temp=0;
                temp^=(1<<((3-i)*4+(3-j)));
                for(k=0;k<4;k++)
                {
                    int x=i+op[k][0];
                    int y=j+op[k][1];
    
                    if(x<0||x>3||y<0||y>3) continue;
                    temp^=(1<<((3-x)*4+(3-y)));
                }
                ch[cnt++]=temp;
            }
        }
    }
    void init_ans()
    {
        mat[0]=0;
        int i,j,k;
        queue<int> q;
        q.push(0);
        while(!q.empty())
        {
            int now=q.front();
            int next;
            vis[now] = 1;
            q.pop();
    
            for(i=0;i<16;i++)
            {
                next=now^ch[i];
                if(vis[next]==0)
                {vis[next]=1;
                    mat[next]=mat[now]+1;
                    q.push(next);
                }
            }
        }
    }
    int main()
    {
       int i,j,k;
       memset(vis,0,sizeof(vis));
       memset(mat,-1,sizeof(mat));
       init_ch();
       init_ans();
       char str[10][10];
       while(scanf("%s",str[0])!=EOF)
       {
           for(i=1;i<4;i++)
           {
               scanf("%s",str[i]);
           }
    
           /*
           for(i=0;i<4;i++)
           {
               printf("%s
    ",str[i]);
           }
           printf("
    ");
           */
    
           int now=0,now1=0;
           for(i=0;i<4;i++)
           {
               for(j=0;j<4;j++)
               {
                   now1<<=1;
                   now<<=1;
                   if(str[i][j]=='b') now+=1;
                   if(str[i][j]=='w') now1+=1;
                   //printf("%d %d
    ",i,now);
               }
           }
           //now1=now^(1<<16-1);
    
           int ans;
    
           if(vis[now]==0&&vis[now1]==0)
           {
               printf("Impossible
    ");
           }
           else if(vis[now]==0)
           {
               printf("%d
    ",mat[now1]);
           }
           else if(vis[now1]==0)
           {
               printf("%d
    ",mat[now]);
           }
           else printf("%d
    ",min(mat[now],mat[now1]));
    
    
       }
        return 0;
    }
    
  • 相关阅读:
    学习笔记 js跨域请求
    使用Crate dunce获得绝对路径
    自己实现的组件库
    320 什么是 WXML 模版
    325 笛卡尔积算法
    324 借用构造函数继承
    322 n个台阶 一次只能走 一步或者两步,问有多少种走法
    322 原型链继承
    320 说说 SSR?
    321 实现1物理像素边框
  • 原文地址:https://www.cnblogs.com/sola1994/p/4678960.html
Copyright © 2020-2023  润新知