1 条题解
-
0
题意分析
这道题目是关于五子棋游戏胜负判断的问题。五子棋是在19x19的棋盘上进行的,两名玩家分别执黑子和白子轮流下棋,黑子先行。游戏的目标是在水平、垂直或对角线上形成连续的五颗同色棋子(不能超过五颗)。题目要求我们根据给定的棋盘状态,判断当前是否有玩家获胜(黑子或白子),并输出获胜方的棋子颜色以及五连子的起始位置(最左或最上的位置)。
解题思路
1.输入处理: 首先读取测试用例的数量t。对于每个测试用例,读取19x19的棋盘状态,其中1表示黑子,2表示白子,0表示空位。
2.棋盘遍历: 遍历棋盘的每一个格子(从(1,1)到(19,19))。对于每个非空(即值为1或2)的格子,检查其四个可能的方向(水平、垂直、主对角线、副对角线)是否存在连续的五颗同色棋子。
3.方向检查: 定义四个方向的变化量dx和dy: 水平方向:(0, 1) 垂直方向:(1, 0) 主对角线方向:(1, 1) 副对角线方向:(1, -1)
对于每个方向,从当前格子出发,检查连续的四个格子是否与当前格子的颜色相同。 如果连续四个格子颜色相同,还需要检查第五个格子是否颜色不同(确保恰好五连子,而不是更多)。
4.胜负判断:
如果找到满足条件的五连子,立即输出当前玩家的颜色(1或2)以及起始位置(最左或最上的位置)。 如果没有找到任何五连子,输出0表示尚未分出胜负。
5.边界处理: 由于棋盘是19x19的,为了避免数组越界,可以将棋盘外围扩展一圈(即使用$$25x25$$的数组),并将外围初始化为0,这样在检查时可以忽略边界问题。
代码实现
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 25 int table[25][25]; //将边界之外的部分设置为0,便于忽略边界处情况 int t; int dx[4]={1,0,1,-1},dy[4]={1,1,0,1}; void solve() { for(int row=1;row<=19;row++){ for(int col=1;col<=19;col++){ // 遍历每个格子 if(table[row][col]!=0){ for(int i=0;i<4;i++){ //对每个方向上的情况进行判断 for(int j=1;j<5;j++){ // cout<<row+dx[i]*j<<' '<<dx[i]*j<<' '; if(table[row+dx[i]*j][col+dy[i]*j]!=table[row][col]) break; if(j==4){ if(table[row-dx[i]][col-dy[i]]!=table[row][col]&&table[row+dx[i]*5][col+dy[i]*5]!=table[row][col]){ printf("%d\n%d %d\n",table[row][col],row,col); return ; } } } // cout<<endl; } } } } cout<<"0"<<endl; } int main() { // freopen("in.txt", "r", stdin); memset(table,0,sizeof(table)); int t; cin>>t; while(t--){ for(int i=1;i<=19;i++){ for(int j=1;j<=19;j++){ cin>>table[i][j]; } } solve(); } return 0; }
- 1
信息
- ID
- 971
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者