黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法

这篇具有很好参考价值的文章主要介绍了黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你的任务是模拟黑白棋游戏的进程。黑白棋的规则为:黑白双方轮流放棋子,每次必须让新放的棋子“夹住”至少一枚对方棋子,然后把所有被新放棋子“夹住”的对方棋子替换成己方棋子。一段连续(横、竖或者斜向)的同色棋子被“夹住”的条件是两端都是对方棋子(不能是空位)。如图4-6(a)所示,白棋有6个合法操作,分别为(2,3),(3,3),(3,5),(6,2),(7,3),(7,4)。选择在(7,3)放白棋后变成如图4-6(b)所示效果(注意有竖向和斜向的共两枚黑棋变白)。注意(4,6)的黑色棋子虽然被夹住,但不是被新放的棋子夹住,因此不变白。
黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法,rust题解,rust,算法输入一个8*8的棋盘以及当前下一次操作的游戏者,处理3种指令:

  • L指令打印所有合法操作,按照从上到下,从左到右的顺序排列(没有合法操作时输出No legal move)。
  • Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。输入保证这个操作是合法的。输出操作完毕后黑白方的棋子总数。
  • Q指令退出游戏,并打印当前棋盘(格式同输入)。

样例:
输入

--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M35
L
Q

输出

[(3, 5), (4, 6), (5, 3), (6, 4)]
W is 4. B is 1
[(3, 4), (3, 6), (5, 6)]
--------
--------
----W---
---WW---
---BW---
--------
--------
--------

解法:文章来源地址https://www.toymoban.com/news/detail-721481.html

use std::io;

enum Cmd {
    Print,
    Move(usize, usize),
    Quit,
}
fn main() {
    let mut grid: Vec<Vec<char>> = vec![];
    for _i in 0..8 {
        let mut buf = String::new();
        io::stdin().read_line(&mut buf).unwrap();
        grid.push(buf.trim().chars().collect());
    }
    let mut buf = String::new();
    io::stdin().read_line(&mut buf).unwrap();
    let mut curplayer = buf.trim().chars().nth(0).unwrap();
    let mut cmds: Vec<Cmd> = vec![];
    loop {
        let mut buf = String::new();
        io::stdin().read_line(&mut buf).unwrap();
        buf = buf.trim().to_string();
        if buf == "L" {
            cmds.push(Cmd::Print);
        } else if buf == "Q" {
            cmds.push(Cmd::Quit);
            break;
        } else {
            let i = buf.chars().nth(1).unwrap().to_digit(10).unwrap();
            let j = buf.chars().nth(2).unwrap().to_digit(10).unwrap();
            cmds.push(Cmd::Move(i as usize, j as usize));
        }
    }
    for i in cmds {
        match i {
            Cmd::Print => printmoves(&grid, curplayer),
            Cmd::Move(x, y) => fangzi(&mut grid, &mut curplayer, (x, y)),
            Cmd::Quit => {
                printgrid(&grid);
                break;
            }
        }
    }
}

fn fangzi(grid: &mut Vec<Vec<char>>, curp: &mut char, pos: (usize, usize)) {
    let allmoves = getmoves(grid, *curp);
    if allmoves.is_empty() {
        *curp = oposite(*curp);
    }
    let newpos = (pos.0 - 1, pos.1 - 1);
    grid[newpos.0][newpos.1] = *curp;
    let runs = [
        (0, -1),
        (0, 1),
        (-1, 0),
        (1, 0),
        (-1, -1),
        (1, 1),
        (-1, 1),
        (1, -1),
    ];
    for d in runs {
        if judge(grid, *curp, newpos, d) {
            change(grid, *curp, newpos, d);
        }
    }
    let nums = getnums(grid);
    println!("W is {}. B is {}", nums.0, nums.1);
    *curp = oposite(*curp);
}

fn getnums(grid: &Vec<Vec<char>>) -> (u32, u32) {
    let mut nums = (0, 0);
    for i in 0..8 {
        for j in 0..8 {
            if grid[i][j] == 'W' {
                nums.0 += 1;
            } else if grid[i][j] == 'B' {
                nums.1 += 1;
            }
        }
    }
    return nums;
}
fn oposite(p: char) -> char {
    if p == 'W' {
        'B'
    } else {
        'W'
    }
}
fn printgrid(grid: &Vec<Vec<char>>) {
    for line in grid.iter() {
        println!("{}", line.iter().collect::<String>());
    }
}
fn getmoves(grid: &Vec<Vec<char>>, curp: char) -> Vec<(usize, usize)> {
    let mut allmoves: Vec<(usize, usize)> = vec![];
    let runs = [
        (0, -1),
        (0, 1),
        (-1, 0),
        (1, 0),
        (-1, -1),
        (1, 1),
        (-1, 1),
        (1, -1),
    ];
    for i in 0..8 {
        for j in 0..8 {
            //println!("i,j: {},{}", i, j);
            if grid[i][j] != '-' {
                continue;
            }

            for d in runs {//检查八个方向
                if judge(grid, curp, (i, j), d) {
                    allmoves.push((i + 1, j + 1));
                    break;
                }
            }
        }
    }
    return allmoves;
}
fn judge(grid: &Vec<Vec<char>>, curp: char, pos: (usize, usize), run: (i32, i32)) -> bool {
    let mut x = pos.0;
    let mut y = pos.1;
    let mut bjiazhu = false;
    while x > 0 && x < 7 && y > 0 && y < 7 {
        x = (x as i32 + run.0) as usize;
        y = (y as i32 + run.1) as usize;
        if grid[x][y] == '-'{
            break;
        }
        if grid[x][y] == oposite(curp) {
            bjiazhu = true;
        }else if bjiazhu {
            return true;
        }else {
            break;
        }
    }
    return false;
}
fn change(grid: &mut Vec<Vec<char>>, curp: char, pos: (usize, usize), run: (i32, i32)) {
    let mut x = pos.0;
    let mut y = pos.1;
    while x > 0 && x < 7 && y > 0 && y < 7 {
        x = (x as i32 + run.0) as usize;
        y = (y as i32 + run.1) as usize;
        if grid[x][y] == oposite(curp) {
            grid[x][y] = curp;
        } else {
            return;
        }
    }
}
fn printmoves(grid: &Vec<Vec<char>>, curp: char) {
    let allmoves = getmoves(grid, curp);
    if allmoves.is_empty() {
        println!("No legal move");
    } else {
        println!("{:?}", allmoves);
    }
}

到了这里,关于黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 盒子(Box, ACM/ICPC NEERC 2004, UVa1587)rust解法

    给定6个矩形的长和宽wi和hi(1≤wi,hi≤1000),判断它们能否构成长方体的6个面。 样例 解法

    2024年02月07日
    浏览(26)
  • DNA序列(DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368) rust解法

    输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同)。 输入整数m和n(4≤m≤50,4≤n≤1000),以及m个长度为n的DNA序列(只包含字母A,C,

    2024年02月07日
    浏览(30)
  • 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest G. Pyramid(组合数学 计数)

    题目 t(t=1e6)组样例,每次给定一个n(n=1e9),统计边长为n的上述三角形的等边三角形个数 其中等边三角形的三个顶点,可以在所有黑色三角形白色三角形的顶点中任取, 答案对1e9+7取模 思路来源 申老师 oeis A000332 Solution to Problem #3 题解 oeis打一下前四项的表,发现是C(n,4),并且

    2024年02月07日
    浏览(27)
  • 2020ICPC南京站

    K Co-prime Permutation 题意:给定n和k,让你构造n的排列,满足gcd(pi, i)=1的个数为k。 思路:因为x和x-1互质,1和任何数互质,任何数和它本身不互质 当k为奇数时,p1=1,后面k-1个数两两互换 当k为偶数时,后面k个数两两互换 Let\\\'s Play Curling 题意:给定n块红色石头,m块蓝色石头的位

    2024年02月10日
    浏览(29)
  • 2023ICPC西安邀请赛

    更好的阅读体验:传送门 比赛完由于被旅游、赶ddl、上班等等各种事情影响,导致我现在才有时间可以写写小作文,这中间隔得时间有点长了,已经不知道从哪开始说起了,灵感也都流失了… 比赛前一个周,我的队友djk,也是我的舍友,周一从合肥回来,嗓子的声音严重变

    2024年02月05日
    浏览(32)
  • sakuya726's 2023 ICPC China SiChuan Provincial Programming Contest(ICPC2023四川省赛)游记随笔

    出发前一天,收拾东西做好准备工作。打印了自己记忆中所有高级数据结构的板子(然而实际上并没有卵用),VP一把往年的四川省赛。 不出意外的失眠了,早上九点四十的火车,凌晨五点才睡觉。七点半出发去火车站,天还下着雨,刚开始感觉还挺有意境,然后当我在雨中

    2024年02月07日
    浏览(51)
  • 2020ICPC南京【个人题解EFHKLM】

    首先如果炸弹在(0,0)或者机器人最终停在炸弹处,那么一定Impossible。 对于其他的情况,如果存在一条路径使得机器人可以不经过炸弹,那么一定存在一种方案,使得相同的方向在这个方案种是连在一起的。 于是可以直接枚举所有方向的排列,共4!个,判断每一种排列能否绕过

    2023年04月09日
    浏览(42)
  • XTU-OJ 1170-ICPC

    题目描述 ACM/ICPC比赛涉及的知识点非常多,一个队伍三个人需要能够互补。一个队伍某个知识点的高度是三个人中水平最高的那个人决定。现在给你三个人的每个知识点的水平情况,请计算一下这个队伍的水平。 输入 存在多个样例。每个样例的第一行是一个整数N(3≤N≤100

    2024年02月08日
    浏览(32)
  • 2022icpc西安站部分题解-E

    E. Find Maximum 题意:给定边界L和R,算满足的所有的的最大值, 其中满足: 。 题解: 打表发现发现了f(x)与x的三进制有关系,即f(x)等于x三进制的每个数相加,再加上三进制数的有效位数。下图从左向右依次是x,x的三进制,f(x)。 于是便是将问题转变为在区间中找到三进制的每

    2024年02月08日
    浏览(28)
  • 2022 ICPC 济南 E Identical Parity (扩欧)

    Problem - E - Codeforces ( n   %   k  )个( ⌊ n k ⌋ + 1 )和( k − n   %   k )个( ⌊ n k ⌋ )是否能组成( ⌊ n 2 ⌋ )和( n − ⌊ n 2 ⌋ )的问题 (n ~% ~k ~)个(left lfloor frac{n}{k} right rfloor +1)和(k-n~%~k)个(left lfloor frac{n}{k} right rfloor)是否能组成(left lfloor

    2024年02月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包