问题描述
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;
}