(poj1.2.1)1970(筛选法模拟)

本文介绍了一种用于验证19x19围棋棋盘上棋子布局合法性的算法,通过检查相邻棋子的颜色一致性来判断点是否在有效区域内。该算法能够处理输入的棋局布局,并输出符合规则的棋局或提示无效布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 1970_1.cpp
 *
 *  Created on: 2013年10月6日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>

using namespace std;

int d[4][2] = {{0,1},{1,0},{1,1},{-1,1} };//方向矢量


/**
 * 判断点(x,y)是否在边界里面
 */
bool valid(int x , int y){
	return (x >=0 && x < 19 && y >= 0 && y < 19);
}

int a [20][20];//棋盘

int main(){
	int t;
	scanf("%d",&t);

	while(t--){
		int i,j,k,u;
		int x,y;
		for(i = 0 ; i < 19 ; ++i){
			for(j = 0 ; j < 19 ; ++j){
				scanf("%d",&a[i][j]);
			}
		}

		for(j = 0 ; j < 19 ; ++j){
			for(i = 0 ; i < 19 ; ++i){
				//这个必须要有,因为0表示的是该位置没有棋子,只有在有棋子的情况下,该位置才有意义
				if(a[i][j] == 0){
					continue;
				}

				for(k = 0 ; k < 4 ; ++k){
					//如果反方向同色,换方向
					x = i -  d[k][0];
					y = j - d[k][1];
					if(valid(x,y) && a[x][y] == a[i][j]){
						continue;
					}

					//如果延伸5格后越界,换方向
					x = i + d[k][0]*4 ;
					y = j + d[k][1]*4;
					if(!valid(x,y)){
						continue;
					}

					//如果
					for(u = 0 ; u < 5 ; ++u){
						x = i + d[k][0]*u;
						y = j + d[k][1]*u;

						if(a[x][y] != a[i][j]){
							break;
						}
					}

					////如果5格同色,但6格也同色,也换方向
					x = i + d[k][0]*5;
					y = j + d[k][1]*5;
					if(valid(x,y) && a[x][y] == a[i][j]){
						continue;
					}

					//表示找到了5格同色但6个不同色的情况
					if(u == 5){
						break;
					}
				}

				if(k < 4){
					break;
				}

			}

			if(i < 19){
				break;
			}
		}

		if(j < 19){
			printf("%d\n",a[i][j]);
			printf("%d %d\n",i + 1, j + 1);
		}else{
			printf("0\n");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值