codevs1004 四字连棋 BFS

1004 四子连棋

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

 
 

 

输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description

用最少的步数移动到目标棋局的步数。

样例输入 Sample Input

BWBO
WBWB
BWBW
WBWO

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

hi

package testccf;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;

public class wikioi1004 {
    //为了保存移动方法,创建一个data类,before表示移动的前一步,<span style="font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, 微软雅黑, 黑体, sans-serif;">howToMoveComment为了描述如何移动</span>
    static class data {
        data before;
        ArrayList<Character> map;
        String howToMoveComment;
        public data(data before,ArrayList<Character> map,String howToMoveComment) {
            this.before = before;
            this.map = map;
            this.howToMoveComment = howToMoveComment;
        }
    }
    
    static void showList(ArrayList<Character> list) {
        int n=0;
        for(Character c:list) {
            System.out.print(c);
            n++;
            if(n>=4) {
                n=0;
                System.out.println();
            }
        }
    }
    //判断是否达到目标棋局
    static boolean isFinishMap(ArrayList<Character> map) {
        //左上到右下斜角
        if(map.get(0).charValue()==map.get(5).charValue()) {
            if(map.get(5).charValue()==map.get(10).charValue()){
                if(map.get(10).charValue()==map.get(15).charValue()) {
                    return true;
                }
            }
        }
        //右上到左下斜角
        if(map.get(3).charValue()==map.get(6).charValue()) {
            if(map.get(6).charValue()==map.get(9).charValue()){
                if(map.get(9).charValue()==map.get(12).charValue()) {
                    return true;
                }
            }
        }
        //横线
        for(int i=0;i<3;i++) {
            if(map.get(i*4).charValue()==map.get(i*4+1).charValue()) {
                if(map.get(i*4+1).charValue()==map.get(i*4+2).charValue()) {
                    if(map.get(i*4+2).charValue()==map.get(i*4+3).charValue()) {
                        return true;
                    }
                }
            }
        }
        //竖线
        for(int i=0;i<3;i++) {
            if(map.get(i).charValue()==map.get(i+4).charValue()) {
                if(map.get(i+4).charValue()==map.get(i+8).charValue()) {
                    if(map.get(i+8).charValue()==map.get(i+12).charValue()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<Character> list = new ArrayList<>();
        //BFS的队列
        LinkedList<data> queue = new LinkedList<>();
        for(int i=0;i<4;i++) {
            String line = scanner.next();
            for(int j=0;j<4;j++) {
                list.add(line.charAt(j));
            }
        }
        data first = new data(null,list,null);
        queue.add(first);
        boolean hasAns = true;
        //<span style="font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, 微软雅黑, 黑体, sans-serif;">下面开始BFS       </span>
<span style="font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, 微软雅黑, 黑体, sans-serif;">               while(!isFinishMap(queue.getLast().map)) {</span>
            ArrayList<Character> nowMap = queue.getFirst().map;
            for(int i=0;i<nowMap.size();i++) {
                Character ch = nowMap.get(i);
                if(ch.charValue()=='O') {
                    int h = i/4;
                    int l = i%4;
                    if((h-1)>=0) {
                        ArrayList<Character> newMap = new ArrayList<>(nowMap);
                        newMap.set(i, newMap.get((h-1)*4+l));
                        newMap.set((h-1)*4+l, 'O');
                        queue.add(new data(queue.getFirst(),newMap,"第"+(h-1)+"行"+"第"+l+"列移动到第"+h+"行第"+l+"列"));
                    }
                    if((h+1)<4) {
                        ArrayList<Character> newMap = new ArrayList<>(nowMap);
                        newMap.set(i, newMap.get((h+1)*4+l));
                        newMap.set((h+1)*4+l, 'O');
                        queue.add(new data(queue.getFirst(),newMap,"第"+(h+1)+"行"+"第"+l+"列移动到第"+h+"行第"+l+"列"));
                    }
                    if((l-1)>=0) {
                        ArrayList<Character> newMap = new ArrayList<>(nowMap);
                        newMap.set(i, newMap.get(h*4+l-1));
                        newMap.set(h*4+l-1, 'O');
                        queue.add(new data(queue.getFirst(),newMap,"第"+h+"行"+"第"+(l-1)+"列移动到第"+h+"行第"+l+"列"));
                    }
                    if((l+1)<4) {
                        ArrayList<Character> newMap = new ArrayList<>(nowMap);
                        newMap.set(i, newMap.get(h*4+l+1));
                        newMap.set(h*4+l+1, 'O');
                        queue.add(new data(queue.getFirst(),newMap,"第"+h+"行"+"第"+(l+1)+"列移动到第"+h+"行第"+l+"列"));
                    }
                }
            }
            queue.remove();
            if(queue.isEmpty()) {System.out.print("No Answer!");hasAns=false;break;}
        }
        Stack<data> stack = new Stack<>();
        data d = queue.getLast();
        while(d!=null) {
            stack.push(d);
            d = d.before;
        }
        System.out.println("移动了"+(stack.size()-1)+"步:");
        while(!stack.isEmpty()) {
            data tmpd = stack.pop();
            showList(tmpd.map);
            if(!stack.isEmpty()) {
            String tmp = stack.peek().howToMoveComment;
            if(tmp!=null) {
            System.out.println(tmp);
            }
            }
            System.out.println("----------------");
        }
    }
}
代码输入:
BWBO
WBWB
BWBW
WBWO

代码输出:
移动了6步:
BWBO
WBWB
BWBW
WBWO
第1行第3列移动到第0行第3列
----------------
BWBB
WBWO
BWBW
WBWO
第2行第3列移动到第1行第3列
----------------
BWBB
WBWW
BWBO
WBWO
第3行第2列移动到第3行第3列
----------------
BWBB
WBWW
BWBO
WBOW
第3行第3列移动到第2行第3列
----------------
BWBB
WBWW
BWBW
WBOO
第3行第1列移动到第3行第2列
----------------
BWBB
WBWW
BWBW
WOBO
第3行第2列移动到第3行第3列
----------------
BWBB
WBWW
BWBW
WOOB
----------------
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值