2017 计蒜之道 初赛 第一场阿里的新游戏

betball贝博app 算法题 467 次浏览 没有评论

阿里的新游戏

阿里九游开放平台近日上架了一款新的益智类游戏——成三棋。成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示:

成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:

如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。

样例对应的棋盘如下:

输入格式

输入第一行两个整数 n,m(3 \le n, m \le 9)n 表示小红的棋子数,m 表示小明的棋子数。

接下来 n 行输入小红的棋子坐标。

接下来 m 行输入小明的棋子坐标。

输入保证坐标合法,并且棋子之间不重合。

输出格式

输出小红成三的线段数。

样例输入

6 3
-1 0
-2 0
-3 0
-1 -1
-1 1
1 0
0 2
0 3
2 2

样例输出

[cce_cpp]
#include <stdio.h>
#include <string.h>
int main(){
	int n, m, i, j, xt, yt, count, flag;
	char map[7][7] = { 0 };
	scanf("%d%d", &n, &m);
	for (i = 0; i < n; i++){
		scanf("%d%d", &xt, &yt);
		map[xt + 3][yt + 3] = 1;
	}
	for (i = 0; i < m; i++){
		scanf("%d%d", &xt, &yt);
		xt += 3; yt += 3;
		//  map[xt+3][yt+3] =2;
		if (xt + yt == 6){//右对角线
			map[3][yt] = 0; map[yt][yt] = 0;
			map[xt][3] = 0; map[xt][xt] = 0;
		}
		else if (xt == yt){//左对角线
			map[6 - xt][yt] = 0; map[3][yt] = 0;
			map[xt][6 - yt] = 0; map[xt][3] = 0;
		}
		else{
			if (xt == 3){
				if (yt < 3){
					map[3][0] = 0; map[3][1] = 0; map[3][2] = 0;
				}
				else{
					map[3][4] = 0; map[3][5] = 0; map[3][6] = 0;
				}
			}
			else{
				if (xt < 3){
					map[0][3] = 0; map[1][3] = 0; map[2][3] = 0;
				}
				else{
					map[0][4] = 0; map[1][5] = 0; map[2][6] = 0;
				}
			}
		}
	}
	count = 0;
	for (i = 0; i < 6; i++)
	for (j = 0; j < 6; j++){
		flag = 0;
		if (map[i][j] == 1){
			if (i + j == 6){//右对角线
				if (map[3][i] == 1 && map[j][j] == 1){
					count++; flag = 1;
				}
				if (map[i][3] == 1 && map[i][i] == 1){
					count++; flag = 1;
				}
				//                   if(flag==1){map[i][j]==0;continue;}            
			}
			else if (i == j){//左对角线
				if (map[6 - i][j] == 1 && map[3][j] == 1){
					count++; flag = 1;
				}
				if (map[i][6 - j] == 1 && map[i][3] == 1){
					count++; flag = 1;
				}
				//                   if(flag==1){map[i][j]==0;continue;}   
			}
			else{
				if (i == 3){
					if (j < 3)
					if (map[3][0] == 1 && map[3][1] == 1 && map[3][2] == 1){
						count++; flag = 1;
					}
					else
					if (map[3][4] == 1 && map[3][5] == 1 && map[3][6] == 1){
						count++; flag = 1;
					}
					//						if(flag==1){map[i][j]==0;continue;}   
				}
				else{
					if (i < 3)
					if (map[0][3] == 1 && map[1][3] == 1 && map[2][3] == 1){
						count++; flag = 1;
					}
					else
					if (map[0][4] == 1 && map[1][5] == 1 && map[2][6] == 1){
						count++; flag = 1;
					}
					//						if(flag==1){map[i][j]==0;continue;}   
				}
			}
		}
		map[i][j] = 0;
	}
	printf("%d\n", count);

	return 0;
}
[/cce_cpp]

发表评论

邮箱地址不会被公开。

Go