程序基本算法习题解析 能否获胜:一个4*4的棋盘,每个单元可能是“.”“o”“x”的一种,现在需要判断:如果下一步轮到甲下棋,他能否获胜?

题目:

 一个4*4的棋盘,每个单元可能是“.”“o”“x”的一种。其中,“.”代表当前单元没有棋子,“o”代表当前单元有乙的棋子,“x”代表当前单元有甲的棋子。现在需要判断:如果下一步轮到甲下棋,他能否获胜?(胜利的规则是棋盘上有自己方的3个子在一条线上,这条线可以是水平、竖直或者斜45°)。

思路:

可以遍历所有没有棋子的单元,挨个填'x'进行获胜判断。

代码如下:

// Chapter11_3.cpp : Defines the entry point for the application.
// 能否获胜
// 一个4*4的棋盘,每个单元可能是“.”“o”“x”的一种。其中,“.”代表当前单元没有棋子,
// “o”代表当前单元有乙的棋子,“x”代表当前单元有甲的棋子。
// 现在需要判断:如果下一步轮到甲下棋,他能否获胜?
// (胜利的规则是棋盘上有自己方的3个子在一条线上,这条线可以是水平、竖直或者斜45°)。

#include "stdafx.h"
#include<iostream>
using namespace std;

//判断是否能获胜
//chess[4][4]为棋盘局势,d为需要判断的棋子种类
int isSuccess(char chess[4][4],char d)
{
	int i,j;
	for(i=0;i<4;i++) 
	{
		for(j=0;j<2;j++) //不管是判断行还是判断列,均需判断3个连续的棋子,因此j<2
		{
			//“||”前面的部分是判断自己方的连续3个棋子是否能连成1行,“||”后面部分是判断自己方的连续3个棋子是否能连成1列
			if((chess[i][j] == 'x' && chess[i][j+1] == 'x' && chess[i][j+2] == 'x') || (chess[j][i] == 'x' && chess[j+1][i] == 'x' && chess[j+2][i] == 'x'))
				return 1;
		}
	}
	//判断自己方的连续3个棋子是否能连成45°斜线
	//选取中间四个点为斜线上的中心点
	for(i=1;i<3;i++)
		for(j=1;j<3;j++)
		{
			if((chess[i-1][j-1] == 'x' && chess[i][j] == 'x' && chess[i+1][j+1] == 'x') || (chess[i-1][j+1] == 'x' && chess[i][j] == 'x' && chess[i+1][j+1] == 'x'))
				return 1;
		}
	//以上情况均不是时(自己方的3个点不在一条线上),返回0
	return 0;
}
int main()
{
	int i,j;
	char chess[4][4];  //棋局局势
	//输入当前局势
	cout << "输入当前局势:" << endl;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			cin >> chess[i][j];
		}
	//遍历所有单元
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			//在没有填棋子的单元尝试填‘x’
			if(chess[i][j] == '.')
			{
				chess[i][j] = 'x';
				//判断在该单元填'x',甲是否能获胜
				if(isSuccess(chess,'x'))
				{
					cout << "甲可以获胜!" << endl;
					system("pause");
				}
				//如果该单元填'x',甲不能获胜,则换一个单元填'x'试试
				else
					chess[i][j] = '.';
			}
		}
	//当所有单元都试过后,甲均不能获胜,则输出甲不能获胜语句
	cout << "甲不能获胜!" << endl;
	system("pause");
	return 0;
}

运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值