列表

详情


NC239210. 国际象棋

描述

你自己在一个 nm 列的棋盘上玩游戏,但这张棋盘是立起来的,棋子受到重力的作用,都掉落在对应列的最下方。换句话说,不在最后一行的棋子的下面都一定有棋子。

你一颗一颗的落子,依次按照黑棋白棋交替的顺序落子。当出现了 k 子连珠的局面时,游戏结束。k 子连珠指的是横竖斜共 8 个方向中有连续 k 颗棋子的颜色均相同。

现在有一份你落下 t 颗子的记录,每次操作在第 i 列顶端加入一颗棋子,奇数次落子时这颗子是黑棋,否则是白棋,请问游戏结束时你落下了多少颗棋子,以后的记录均没有意义,可以忽略。

你是一个严谨的人,在这份记录中游戏一定会结束且棋子不会堆叠超过 n 层。


输入描述

第一行四个整数 n, m, k, t,接下来一行共 t 个数,依次代表每一次落子的 i


输出描述

输出一个数,即游戏结束时棋盘上的棋子数量。

示例1

输入:

5 5 2 3
1 2 1

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 4400K, 提交时间: 2022-11-03 19:57:47

#include<bits/stdc++.h>
using namespace std;
int fx[]={1,0,1,1};
int fy[]={0,1,-1,1};
int main(){
	int n,m,k,t; scanf("%d%d%d%d",&n,&m,&k,&t);
	vector<vector<int>>mp(n+1,vector<int>(m+1));
	vector<int>len(m+1);
	int col=1;
	for(int p=1;p<=t;++p){
		int i; scanf("%d",&i);
		mp[++len[i]][i]=col; col=-col;
		for(int j=0;j<4;++j){
			int cnt=1,x=len[i]+fx[j],y=i+fy[j];
			while(1<=x && x<=n && 1<=y && y<=m && mp[x][y]==mp[len[i]][i]){ ++cnt; x+=fx[j]; y+=fy[j]; }
			x=len[i]-fx[j]; y=i-fy[j];
			while(1<=x && x<=n && 1<=y && y<=m && mp[x][y]==mp[len[i]][i]){ ++cnt; x-=fx[j]; y-=fy[j]; }
			if(cnt>=k){
				printf("%d",p);
				return 0;
			}
		}
	}
	printf("%d",t);
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 400K, 提交时间: 2023-04-26 18:16:43

#include<bits/stdc++.h>
using namespace std;
int d[2000][2000]; 
int dx[]={1,1,0,-1};
int dy[]={0,1,1,1};
int main()
{
	int n,m,k,t;
	cin>>n>>m>>k>>t;
	map<int,int> mp;
	for(int i=1;i<=t;i++)
	{
		int a,f=0,p;
		cin>>a;
		if(i%2==1)p=1;
		else p=2;
		if(mp[a]==0)mp[a]=1;
		d[mp[a]][a]=p;
		for(int j=0;j<4;j++)
		{
			int x=mp[a],y=a,sum=0;
			while(d[x][y]==p&&x>0&&x<=n&&y>0&&y<=m)
			{
				sum++;
				x+=dx[j];
				y+=dy[j];
			}
			x=mp[a],y=a;
			while(d[x][y]==p&&x>0&&x<=n&&y>0&&y<=m)
			{
				sum++;
				x-=dx[j];
				y-=dy[j];
			}
			if(sum-1>=k)
			{
				cout<<i;
				return 0;
			}
		}
			
		
		
		mp[a]++;
	}
}

上一题