问题描述
一只业余足球队在安排11名球员的位置,球队踢4-3-3的战术(即1门将,4后卫,3中场,3前锋)。
每名球员有自己愿意踢的位置,比如MS只愿意踢后卫,而CR愿意踢中场和前锋。
作为球队教练的Lazy想知道,有多少种方案可以满足所有11名球员的愿望。
由于球队非常业余,所以不考虑后卫、中场、前锋各自内部的排列,即后卫{A,B,C,D}和后卫{D,C,B,A}是一样的。
输入格式
11行,每行长度为4的零一串,依次表示球员是否愿意做门将、后卫、中场、前锋。0表示不愿意,1表示愿意。
输出格式
1行一个整数表示方案数。
样例输入
1000
0100
0100
0100
0100
0010
0010
0010
0001
0001
0001
样例输出
1
思路:
深搜+回溯。如果当前球员想当当前职位,就让他当,然后进入下一个球员并在对应职位人数上加1,然后回溯在对应职位人数减1。搜索到最后一名球员时检查职位人数是否满足要求,满足要求则ans+1,再return。
代码如下:
#include<bits/stdc++.h>
using namespace std;
char hope[11][4];
bool vis[11];
int ans=0;
int cnt[4];
void dfs(int step)
{
if(step>=11)
{
if(cnt[0]==1&&cnt[1]==4&&cnt[2]==3&&cnt[3]==3)//判断对应职位上人数是否满足要求
ans++;
return;
}
int i;
for(i=0;i<4;i++)
{
if(hope[step][i]=='1')//当前球员想当i职位
{
cnt[i]++;//i职位人数+1并搜索下一个球员
dfs(step+1);
cnt[i]--;//i职位人数减1,并循环下一个职位
}
}
}
int main()
{
int i,j;
for(i=0;i<11;i++)
{
for(j=0;j<4;j++)
cin>>hope[i][j];
}
dfs(0);
cout<<ans<<endl;
return 0;
}