翻棋子;



import java.util.Scanner;
class YiPanQi{
 public int flagNum;
 public int step;
 public YiPanQi(int flagNum,int step){
  this.flagNum=flagNum;
  this.step=step;
 }
}
class Queue{
 public YiPanQi[] qiData=new YiPanQi[65536];
 public int front=0;
 public int rear=0;
 public void push(YiPanQi m){
  qiData[rear++]=m;
 }
 public YiPanQi pop(){
  return qiData[front++];
 }
 public boolean isEmpty(){
  return front==rear;
 }
}
public class FanQiZi {
  public static char[] yuanData=new char[16];
  public static int[] visit=new int[75536];
 
  public static int twoToTen(int a[]){
   int sum=0;
   for(int i=0;i<16;i++){
    sum=sum*2+a[i];
   }
   return sum;
  }
  public static int[] tenToTwo(int m){
   int[] res=new int[16];
   int pc=15;
   while(m>0){
    res[pc--]=m%2;
    m/=2;
   }
   return res;
  }
  public static int flip(int fl[],int fliposi){
   fl[fliposi]=fl[fliposi]==0?1:0;
   if(fliposi-4>=0)            //up
    fl[fliposi-4]=fl[fliposi-4]==0?1:0;
   if(fliposi+4<16)            //up
    fl[fliposi+4]=fl[fliposi+4]==0?1:0;     //down
   if(fliposi!=0&&fliposi!=4&&fliposi!=8&&fliposi!=12)        //left
    fl[fliposi-1]=fl[fliposi-1]==0?1:0;
   if(fliposi!=3&&fliposi!=7&&fliposi!=11&&fliposi!=15)        //right
    fl[fliposi+1]=fl[fliposi+1]==0?1:0;
   int res=twoToTen(fl);
   return res;
  }
  public static void bFS(int[] stat){
   int ori=twoToTen(stat);
   visit[ori]=1;
   YiPanQi myYiPanQi=new YiPanQi(ori,0);
   Queue myQueue=new Queue();
   myQueue.push(myYiPanQi);
   while(!myQueue.isEmpty()){
   
    YiPanQi tempYiPanQi=myQueue.pop();
    int curQi=tempYiPanQi.flagNum;
    int curLayer=tempYiPanQi.step;
    if(curQi==0||curQi==65535){
     System.out.println(curLayer);
     return;
    }
    int[] curQiEr=tenToTwo(curQi);
    int tempQi[]=new int[16];
    for(int i=0;i<16;i++){
     for(int k=0;k<16;k++){
      tempQi[k]=curQiEr[k];
     }
     int flip_num=flip(tempQi,i);
     if(visit[flip_num]==0){
      YiPanQi nextYiPanQi=new YiPanQi(flip_num,curLayer+1);
      myQueue.push(nextYiPanQi);
      visit[flip_num]=1;
     }
    }
   }
  }
  public static void main(String[] args){
  Scanner sc=new Scanner(System.in);
  String[] strArr=new String[4];
  for(int i=0;i<4;i++){
   strArr[i]=sc.next();
  }
  int yuanData_length=0;
  for(int i=0;i<4;i++){
   for(int j=0;j<4;j++){
      yuanData[yuanData_length++]=strArr[i].charAt(j);
   }
  }
  int[] erjizhiData=new int[16];
  for(int i=0;i<16;i++){
   if(yuanData[i]=='b'){
    erjizhiData[i]=1;
   }else{
    erjizhiData[i]=0;
   }
  }
  bFS(erjizhiData);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值