五子棋

2014年北航机试第二题-五子棋

题目描述
输入一个19*19的矩阵,只包含数字0,1,2。0表示空格,1、2表示两个人的棋子。
要求判断是否有人获胜(横向或竖向或斜向是否连成五个同色棋子)
题目说明输入样例保证每条线上至多只有连线5个同色棋子,并且保证至多只有1人获胜。
如果有人获胜,输出获胜者1或2,加一个冒号,接着输出获胜的五连珠的第一个棋子的坐标,从上到下从左到右序号最小的为第一个,序号从1开始编号。如果无人获胜,输出No。
输入
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0

输出 No
其它案例自行修改
C代码

#include<stdio.h>
int judge(int qipan[19][19]){
	int i, j, t;
	for (i = 0; i<19; i++){
		for (j = 0; j<19; j++){
			if (qipan[i][j] != 0){
				t = qipan[i][j];
				if (j<19 - 4){//判断横向上是否连成五个
					if (t == qipan[i][j + 1] && t == qipan[i][j + 2] && t == qipan[i][j + 3] && t == qipan[i][j + 4]){
						printf("%d:(%d,%d)\n", t, i, j);
						return t;
					}
				}
				if (i<19 - 4){//判断纵向上是否连成五个
					if (t == qipan[i + 1][j] && t == qipan[i + 2][j] && t == qipan[i + 3][j] && t == qipan[i + 4][j]){
						printf("%d:(%d,%d)\n", t, i, j);
						return t;
					}
				}
				if (i<19 - 4 && j<19 - 4){//判断右下方是否连成五个
					if (t == qipan[i + 1][j + 1] && t == qipan[i + 2][j + 2] && t == qipan[i + 3][j + 3] && t == qipan[i + 4][j + 4]){
						printf("%d:(%d,%d)\n", t, i, j);
						return t;
					}
				}
				if (i<19 - 4 && j>3){//判断左下方是否连成五个
					if (t == qipan[i + 1][j - 1] && t == qipan[i + 2][j - 2] && t == qipan[i + 3][j - 3] && t == qipan[i + 4][j - 4]){
						printf("%d:(%d,%d)\n", t, i, j);
						return t;
					}
				}
			}
		}
	}
	return 0;
}

int main(){
	int qipan[19][19];
	int i = 0, j = 0, res = 0;
	for (i = 0; i<19; i++){
		for (j = 0; j<19; j++){
			scanf("%d", &qipan[i][j]);
		}
	}	
	res = judge(qipan);
	if (res == 0){
		printf("no\n");
	}
	return 0;
}
用tkinter 实现的五子棋UI界面 import tkinter as tk from tkinter import messagebox from chessboard import ChessBoard ChessBoard = ChessBoard() class GUI(object): def __init__(self): self.counter = 0 self.winner = 0 self.is_start = False self.is_surrender = False self.window = tk.Tk() # 窗口对象(首字母大写) self.window.title('Gobang') self.window.geometry('800x540') self.window.resizable(width = False, height = False) # 画布对象 棋盘 self.canvas = tk.Canvas(self.window, height = 540, width = 540) self.chessboard = tk.PhotoImage(file = 'Gobang_chessboard/chessboard.gif') self.blackpoint = tk.PhotoImage(file = 'Gobang_chessboard/blackpoint.gif') self.whitepoint = tk.PhotoImage(file = 'Gobang_chessboard/whitepoint.gif') self.canvas.create_image(0, 0, anchor = 'nw', image = self.chessboard) self.canvas.bind("", self.get_point) self.start_point = 10 # 起始点位置 self.step = 35 # 每个格子的跨度 self.canvas.place(x = 0, y = 0) # 标签对象 self.l_info = tk.Label(self.window, text = 'Not started', font=('Arial', 12), width = 25, height = 2) self.l_info.place(x = 545, y = 0) # 文本框对象 self.t = tk.Text(self.window, height = 15) self.t.place(x = 540, y = 40) # 按钮对象 self.f_header = tk.Frame(self.window, highlightthickness=0) self.b_start = tk.Button(self.f_header, text = 'start', command = self.start) self.b_restart = tk.Button(self.f_header, text = 'restart', command = self.restart) self.b_regret = tk.Button(self.f_header, text = 'regret', command = self.regret) self.b_surrender = tk.Button(self.f_header, text = 'surrender', command = self.surrender) self.f_header.place(x = 545, y = 250) self.b_start.pack(side='left', padx=10) self.b_restart.pack(side = 'left') self.b_surrender.pack(side = 'right') self.b_regret.pac
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值