NC16136. 黑白棋
描述
输入描述
每行两个数字x,y代表落子坐标(1 ≤ x,y ≤ 8)
以EOF结束下子,保证下子的正确性以及合法性,下完最后一颗子代表棋局结束。
ps:emmmm... 貌似有点长,不要慌,问题不大(雾
输出描述
输出一行,黑方与白方的棋子数量之比a:b
示例1
输入:
3 4 5 3 6 5 3 5 5 2 7 5 7 6 7 7 8 7 2 3 7 8 5 1 7 4 8 5 4 3 7 3 2 4 2 5 4 2 3 1 1 6 6 3 2 2 1 4 4 6 2 6 1 3 3 3 6 4 3 7 6 2 7 1 8 6 8 8 5 7 2 1 4 1 5 6 1 5 4 7 8 3 6 6 6 7 8 4 1 1 5 8 6 1 3 2 8 1 6 8 3 8 3 6 1 2 8 2 4 8 7 2 2 7 1 7 2 8 1 8
输出:
28:36
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 492K, 提交时间: 2020-05-16 13:57:50
#include<bits/stdc++.h> using namespace std; int i,j,x,y,t=1,a=0,b=0,v[11][11]; int d[8][2]={1,0,-1,0,1,1,1,-1,0,1,0,-1,-1,-1,-1,1}; bool slove(int x,int y,int s) { int X,Y,f=0; for(int i=0;i<8;i++) { X=x+d[i][0],Y=y+d[i][1]; if(v[X][Y]!=(!s))continue; while(v[X+d[i][0]][Y+d[i][1]]==(!s))X+=d[i][0],Y+=d[i][1]; if(v[X+d[i][0]][Y+d[i][1]]==s) { X=x+d[i][0],Y=y+d[i][1]; v[X][Y]=s,f=1; while(v[X+d[i][0]][Y+d[i][1]]==(!s))X+=d[i][0],Y+=d[i][1],v[X][Y]=s; } } return f; } int main() { memset(v,-1,sizeof v); v[4][4]=v[5][5]=0,v[5][4]=v[4][5]=1; while(~scanf("%d%d",&x,&y)) { if(slove(x,y,t))v[x][y]=t,t=!t; else if(slove(x,y,!t))v[x][y]=!t; else break; } for(i=1;i<=8;i++) for(j=1;j<=8;j++) { if(v[i][j]==1)a++; else if(v[i][j]==0)b++; } printf("%d:%d\n",a,b); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2020-03-11 19:15:37
#include<bits/stdc++.h> using namespace std; int v[11][11]; int d[8][2]={1,0,-1,0,1,1,1,-1,0,1,0,-1,-1,-1,-1,1}; bool slove(int x,int y,int s) { bool flag=0; for(int i=0;i<8;i++) { int tx=x+d[i][0]; int ty=y+d[i][1]; if(v[tx][ty]!=(!s)) continue; while(v[tx+d[i][0]][ty+d[i][1]]==(!s)) tx+=d[i][0],ty+=d[i][1]; if(v[tx+d[i][0]][ty+d[i][1]]==s) { tx=x+d[i][0]; ty=y+d[i][1]; v[tx][ty]=s; while(v[tx+d[i][0]][ty+d[i][1]]==(!s)) tx+=d[i][0],ty+=d[i][1],v[tx][ty]=s; flag=1; } } return flag; } int main() { memset(v,-1,sizeof v); v[4][4]=v[5][5]=0; v[5][4]=v[4][5]=1; int x,y,t; t=1; while(~scanf("%d%d",&x,&y)) { if(slove(x,y,t)) v[x][y]=t,t=!t; else if(slove(x,y,!t)) v[x][y]=!t; else break; } int h,b; h=b=0; for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) if(v[i][j]==1) h++; else if(v[i][j]==0) b++; printf("%d:%d\n",h,b); return 0; }