递归从二维数组里面取几个位置------week6模拟

问题描述

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input-1

5 2
1 0 3 1

Sample Output-1

0 0 0 0 8 0 12 36 0

Sample Input-2

25 4

0 0 24 3

Sample Output-2

0 2 18 0 0 644 1656 36432 113344

解题思路以及关键代码

本题的关键就是如何从一个二维数组里面不重复的取几个位置;
用递归比较简明并且容易理解。

void getcard(int count,int aa,int bb)
{
	for(int i=aa;i<=A;i++)
	{
		for(int j=bb;j<=B;j++)
		{
			if(!vis[i][j])
			{
				vis[i][j] = 1;`在这里插入代码片`
				a[count].value = i;
				a[count].color = j;
				getcard(count+1,i,j);
				vis[i][j] = 0;  // 递归出来后恢复原样
			}
		}
		bb = 1;//为了保证不重复并且下一次 j 循环仍然从1开始
	 } 
}

还要注意 一手牌只满足一个牌型
即这“一手牌”从上到下满足的第一个牌型规则就是它的“牌型编号”
(一个整数,属于1到9);在统计ans的时候要注意。

if(count == 6)
	{
		if(func1())
		ans[1]++;
		else if(func2())
			ans[2]++;
		else if(func3())
			ans[3]++;
		else if(func4())
			ans[4]++;
		else if(func5())
			ans[5]++;
		else if(func6())
			ans[6]++;
		else if(func7())
			ans[7]++;
		else if(func8())
			ans[8]++;
		else 
			ans[9]++;	
		return;
	}

全部代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int max_value = 30,max_color = 10;
struct card
{
	int value;
	int color;
	bool operator < (const card & p) const
	{
		return value > p.value;
	}
};
card a[6];
bool vis[max_value][max_color] = {0};
int A,B;
int ans[10]={0};
int values[max_value];
int tmp_value[6];
bool func1()
{
	for (int i = 1; i <= 5; i++) 
	{
		tmp_value[i] = a[i].value;
	}
	sort(tmp_value + 1, tmp_value + 6);//默认是升序 
	for(int i=2;i<=5;i++)
	{
		if(tmp_value[i]!=tmp_value[i-1]+1 || a[i].color!=a[1].color)
			return 0;
	}
	return 1;
}
bool cmp(int a, int b) { return a > b; }
bool func2()
{
	memset(values,0,sizeof(values));
	for(int i=1;i<=5;i++)
	{
		values[a[i].value]++;
	}
	sort(values + 1, values + 1 + max_value, cmp);
	if(values[1]==4) 
		return 1;
	else
		return 0;
}
bool func3()
{
	memset(values,0,sizeof(values));
	for(int i=1;i<=5;i++)
	{
		values[a[i].value]++;
	}
	sort(values + 1, values + 1 + max_value, cmp);
	if(values[1]==3&&values[2]==2) 
		return 1;
	else
	  	return 0;
}
bool func4()
{
	for(int i=2;i<=5;i++)
	{
		if(a[i].color!=a[1].color)
			return 0;
	}
	return 1;
}
bool func5()
{
	for (int i = 1; i <= 5; i++) 
	{
		tmp_value[i] = a[i].value;
	}
	sort(tmp_value + 1, tmp_value + 6);//默认是升序 
	for(int i=2;i<=5;i++)
	{
		if(tmp_value[i]!=tmp_value[i-1]+1)
			return 0;
	}
	return 1;
}
bool func6()
{
	memset(values,0,sizeof(values));
	for(int i=1;i<=5;i++)
	{
		values[a[i].value]++;
	}
	sort(values + 1, values + 1 + max_value, cmp);
	if(values[1]==3) 
		return 1;
	else
	  	return 0;
}
bool func7()
{
	memset(values,0,sizeof(values));
	for(int i=1;i<=5;i++)
	{
		values[a[i].value]++;
	}
	sort(values + 1, values + 1 + max_value, cmp);
	if(values[1]==2&&values[2]==2) 
		return 1;
	else
	  	return 0;
}
bool func8()
{
	memset(values,0,sizeof(values));
	for(int i=1;i<=5;i++)
	{
		values[a[i].value]++;
	}
	sort(values + 1, values + 1 + max_value, cmp);
	if(values[1]==2) 
		return 1;
	else
	  	return 0;
}
void getcard(int count,int aa,int bb)
{
	if(count == 6)
	{
		if(func1())
		ans[1]++;
		else if(func2())
			ans[2]++;
		else if(func3())
			ans[3]++;
		else if(func4())
			ans[4]++;
		else if(func5())
			ans[5]++;
		else if(func6())
			ans[6]++;
		else if(func7())
			ans[7]++;
		else if(func8())
			ans[8]++;
		else 
			ans[9]++;	
		return;
	}
	for(int i=aa;i<=A;i++)
	{
		for(int j=bb;j<=B;j++)
		{
			if(!vis[i][j])
			{
				vis[i][j] = 1;
				a[count].value = i;
				a[count].color = j;
				getcard(count+1,i,j);
				vis[i][j] = 0;
			}
		}
		bb = 1;
	 } 
}
int main()
{
	cin>>A>>B;
	for(int i=1;i<=2;i++)
	{
		cin>>a[i].value>>a[i].color;
		a[i].value++ , a[i].color++;
		vis[a[i].value][a[i].color] = true;
	}
	getcard(3, 1, 1);

	for (int i = 1; i <= 9; i++) 
	{
		cout << ans[i] << " ";
	}
	cout << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值