1 条题解

  • 0
    @ 2025-4-9 21:48:19

    题意分析

    这道题目是关于五子棋游戏胜负判断的问题。五子棋是在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
    上传者