NC239210. 国际象棋
描述
输入描述
第一行四个整数,接下来一行共
个数,依次代表每一次落子的
。
,
,
,
。
输出描述
输出一个数,即游戏结束时棋盘上的棋子数量。
示例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]++; } }