求大佬们帮忙康康代码哪里有问题
  • 板块灌水区
  • 楼主xiaoerhuo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 10:30
  • 上次更新2024/10/20 12:14:18
查看原帖
求大佬们帮忙康康代码哪里有问题
1477853
xiaoerhuo楼主2024/10/20 10:30

题目是这样的 将1到9这9个数字分成三组,每组分别包含n、m、k个数字,满足条件 n+m+k=9。每个数字只能属于一个组。若使用每组中的数字能构建出至少一个完全平方数,则称这种划分方式是合法的。构建平方数时每个数字可以使用0次或1次。完全平方数是指可以表示为某个正整数的平方的数。题目要求计算有多少种这样的合法划分方式。

输入格式为一行,包含3个正整数n, m, k。 我的代码如下

#include <stdio.h>
int ans = 0;//ans代表答案数目
int a[10][10];//标记每一组的每个数
int b[10] = {0,0,0,0,0,0,0,0,0,0};//标记1-9每个数字是否被标记
int g[4];//标记每个组的数字数目



int vaild(int g,int n)
{
	int c2 = 0, c3 = 0, c5 = 0, c6 = 0, c7 = 0;//标记是否有25,36,576
	int result=0;
	for (int j = 1; j <= n; j++)
	{
		if (a[g][j] == 1 || a[g][j] == 4 || a[g][j] == 9)
		{
			result = 1;
			break;
		}
		if (a[g][j] == 2) c2 = 1;
		else if (a[g][j] == 3) c3 = 1;
		else if (a[g][j] == 5) c5 = 1;
		else if (a[g][j] == 6) c6 = 1;
		else if (a[g][j] == 7) c7 = 1;
		if (c2 == 1 && c5 == 1)
		{
			result = 1;
			break;
		}
		if (c3 == 1 && c6 == 1)
		{
			result = 1;
			break;
		}
		if (c5 == 1 && c6 == 1 && c7 == 1)
		{
			result = 1;
			break;
		}
	}
	return result;
}

void dfs(int group, int num)//group代表第几组,num代表第几个数字
{
	if (group == 4)//此时已输完,递归结束
	{
		ans++;
		return;
	}

	for (int i = 1; i <= 9; i++)//从自然数1开始递归循环
	{
		if (b[i]!=1)
		{
			b[i] = 1;
			a[group][num] = i;
			if (num == g[group])//数字已填满,判断是否合法
			{
				if (vaild(group, num))
				{
					dfs(group + 1, 1);
				}
			}
			else//数字还未填满,去找下一个数字
			{
				dfs(group, num + 1);
			}
			b[i] = 0;
		}
	}
}

int main()
{
	scanf_s("%d %d %d", &g[1], &g[2], &g[3]);
	dfs(1, 1);
	printf_s("%d", ans);
	return 0;
}

2024/10/20 10:30
加载中...