列表

详情


NC219034. 五连珠

描述

混乱的填进两个的矩阵里,然后再给出的一个排列,按照排列依次划去两个矩阵中对应的元素,直到有矩阵被划掉的数字正好是一行或一列或者主对角线或副对角线时结束。

输出结束时满足条件的是第几个矩阵,若两个矩阵同时满足,输出

输入描述

第一行一个正整数,代表测试数据的组数, 

每组测试数据先给出两个的矩阵,然后在一行中给出的一个排列

输出描述

每组数据输出 "0" or "1" or "2".

示例1

输入:

2
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 05 18 19 12 08 21 15 06 10 16 03 24 20 25 13 23 11
03 21 05 15 08
14 10 17 23 04
18 06 22 12 09
24 20 13 07 16
11 25 01 19 02
22 12 15 03 16
11 23 20 14 19
02 17 09 05 07
24 04 10 21 01
06 13 18 25 08
04 14 07 22 02 01 09 17 13 05 18 19 12 08 21 15 06 10 16 03 24 20 25 23 11

输出:

2
0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 3ms, 内存消耗: 372K, 提交时间: 2021-03-21 22:09:15

#include<stdio.h>
int hen1[6],hen2[6],su1[6],su2[6],du1[26][2],du2[26][2],xie1[2],xie2[2],d[26];
int main()
{
	int i,j,k,l,m,n,t,q1,q2;
	scanf("%d",&t);
	for(i=0;i<t;i++){
		q1=0,q2=0;
		for(j=1;j<6;j++){
			hen1[j]=0;
			hen2[j]=0;
			su1[j]=0;
			su2[j]=0;
		}
		for(j=0;j<2;j++){
			xie1[j]=0;
			xie2[j]=0;
		}
		for(l=1;l<6;l++)
		for(j=1;j<6;j++){
			scanf("%d",&k);
			du1[k][0]=l;
			du1[k][1]=j;
		}
		for(l=1;l<6;l++)
		for(j=1;j<6;j++){
			scanf("%d",&k);
			du2[k][0]=l;
			du2[k][1]=j;
		}
		for(j=0;j<25;j++)
		scanf("%d",&d[j]);
		for(j=0;j<25;j++){
			++hen1[du1[d[j]][0]]==5;
			++su1[du1[d[j]][1]]==5;
			++hen2[du2[d[j]][0]]==5;
			++su2[du2[d[j]][1]]==5;
			if(du1[d[j]][0]==du1[d[j]][1])
			++xie1[0];
			if(du1[d[j]][0]+du1[d[j]][1]==5)
			++xie1[1];
			if(du2[d[j]][0]==du2[d[j]][1])
			++xie2[0];
			if(du2[d[j]][0]+du2[d[j]][1]==5)
			++xie2[1];
		
		for(l=1;l<6;l++){
			if(hen1[l]==5||su1[l]==5)
			q1=1;
			if(hen2[l]==5||su2[l]==5)
			q2=1;
		}
		for(l=0;l<2;l++){
			if(xie1[l]==5)
			q1=1;
			if(xie2[l]==5)
			q2=1;
		}
		if(q1==1||q2==1){
		if(q1==1&&q2==1)
		printf("0\n");
		else
		if(q1==1)
		printf("1\n");
		else
		if(q2==1)
		printf("2\n");
		break;
	}
	}
	}
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2022-09-27 19:37:40

#include<bits/stdc++.h>
using namespace std;

bool check(int a[5][5])
{
	int i,j,s;
	for(i=0;i<5;i++)
	{
		for(s=j=0;j<5;j++)s+=a[i][j];
		if(!s)return 1;
		for(s=j=0;j<5;j++)s+=a[j][i];
		if(!s)return 1;
	}
	for(s=i=0;i<5;i++)s+=a[i][i];
	if(!s)return 1;
	for(s=i=0;i<5;i++)s+=a[i][4-i];
	if(!s)return 1;
	return 0;
}
int main()
{
	int i,j,k,x,ans,flag1,flag2,a[5][5],b[5][5],T;
	scanf("%d",&T);
	while(T--)
	{
		for(i=0;i<5;i++)
			for(j=0;j<5;j++)scanf("%d",&a[i][j]);
		for(i=0;i<5;i++)
			for(j=0;j<5;j++)scanf("%d",&b[i][j]);
		for(ans=3,i=0;i<25;i++)
		{
			scanf("%d",&x);
			if(ans<3)continue;
			for(j=0;j<5;j++)
				for(k=0;k<5;k++)if(a[j][k]==x)a[j][k]=0;
			for(j=0;j<5;j++)
				for(k=0;k<5;k++)if(b[j][k]==x)b[j][k]=0;
			flag1=check(a),flag2=check(b);
			if(flag1&&!flag2)ans=1;
			else if(!flag1&&flag2)ans=2;
			else if(flag1&&flag2)ans=0;
		}
		printf("%d\n",ans);
	}
	return 0;
}

上一题