1 条题解
-
0
自动搬运
来自洛谷,原作者为

Dianna
╭(╯^╰)╮,讨厌python让我们c++没有了优越感!!!搬运于
2025-08-24 21:18:09,当前版本为作者最后更新于2025-06-26 10:24:59,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
由于本蒟蒻实在是太弱了,所以没有什么特别好的方法,直接暴力吧。这道题模拟即可,代码谈不上简洁但绝对易懂。主要思路是黑与白轮流下,判断某一步是否合法,如果合法就落子,不合法就标记一下,然后另一方下。循环下去后如果两方都无法落子,就判断胜负,将结果累加下去。
判断代码:
bool hf(int x,int y,int p){ //hf是合法的缩写 bool pd=false; for(int i=0;i<8;i++){ int x1=x+s[i]; int y1=y+q[i]; int cnt=0; while(x1>0&&y1>0&&x1<=n&&y1<=n&&a[x1][y1]==1-p){ cnt++,x1+=s[i],y1+=q[i]; } //没用continue因为不需要 if(x1>0&&y1>0&&x1<=n&&y1<=n&&a[x1][y1]==p&&cnt>0){ x1-=s[i],y1-=q[i]; while(a[x1][y1]==1-p){ a[x1][y1]=p; x1-=s[i],y1-=q[i]; } pd=true; } } if(pd) a[x][y]=p; return pd; }这个判断代码有些麻烦,总体思路是延八个方向搜索,如果碰到边界或没落子的地方直接过,如果碰到非起点的同色子就将 pd 设为 true 。注意如果这一步成功不要直接break,继续看一看有没有新可以转换的棋子
完整代码如下:
#include<bits/stdc++.h> using namespace std; const int s[8]={-1,-1,-1,0,0,1,1,1},q[8]={-1,0,1,-1,1,-1,0,1}; int x,y,z; int n,a[6][6]; bool hf(int x,int y,int p)//hf 是合法的缩写 { bool pd=false; for(int i=0;i<8;i++){ int x1=x+s[i]; int y1=y+q[i]; int cnt=0; while(x1>0&&y1>0&&x1<=n&&y1<=n&&a[x1][y1]==1-p){ cnt++,x1+=s[i],y1+=q[i]; }//没用 continue 因为不需要 if(x1>0&&y1>0&&x1<=n&&y1<=n&&a[x1][y1]==p&&cnt>0){ x1-=s[i],y1-=q[i]; while(a[x1][y1]==1-p){ a[x1][y1]=p; x1-=s[i],y1-=q[i]; } pd=true; } } if(pd) a[x][y]=p; return pd; } void hei(bool pd);//bool 函数是判断上一次有没有成功落子 void bai(bool pd){ bool p=false; int cmp[6][6]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cmp[i][j]=a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==-1&&hf(i,j,0)){ p=true; hei(true); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=cmp[i][j]; } } } } } if(!p){ if(pd) hei(false); else{ int h=0,b=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==0) b++; if(a[i][j]==1) h++; } } if(h>b) x++; else if(b>h) y++; else z++; } } } void hei(bool pd){ bool p=false; int cmp[6][6]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cmp[i][j]=a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==-1&&hf(i,j,1)){ p=true; bai(true); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=cmp[i][j]; } } } } } if(!p){ if(pd) bai(false); else{ int h=0,b=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==0) b++; if(a[i][j]==1) h++; } } if(h>b) x++; else if(b>h) y++; else z++; } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&a[i][j]); } } bai(true); printf("%d %d %d",x,y,z); return 0; }各位大佬不喜勿喷,有问题评论区留言
- 1
信息
- ID
- 11734
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者