杭电1716
题目
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int card[6],vist[6],num[26],curnum[6];
int counts;
void dfs(int step)
{
if(step==5)
{
num[counts]=curnum[1]*1000+curnum[2]*100+curnum[3]*10+curnum[4];
counts++;
return;
}
for(int i=1;i<=4;i++)
{
if(vist[i]==0)
{
curnum[step]=card[i];
vist[i]=1;
dfs(step+1);
vist[i]=0;
}
}
}
int main()
{
cin>>card[1]>>card[2]>>card[3]>>card[4];
while(card[1]!=0||card[2]!=0||card[3]!=0||card[4]!=0)
{
memset(vist,0,sizeof(vist));
memset(num,0,sizeof(num));
memset(curnum,0,sizeof(curnum));
counts=1;
dfs(1);
sort(num+1,num+25);
int firstcout=0;
for(int i=1;i<=24;i++)
{
if(num[i]!=num[i+1]&&num[i]>=1000)
{
if(i==24&&firstcout==0) cout<<num[i]<<endl;
else
{
if(firstcout==0)
{
cout<<num[i];
firstcout=1;
}
else
{
if(num[i]/1000!=num[i+1]/1000)
{
cout<<" "<<num[i];
firstcout=0;
cout<<endl;
}
else cout<<" "<<num[i];
}
}
}
}
cin>>card[1]>>card[2]>>card[3]>>card[4];
if(card[1]==0&&card[2]==0&&card[3]==0&&card[4]==0)
{
break;
}
else cout<<endl;
}
return 0;
}
解题思路
利用dfs求解 全排列后进行排序重复不输出,加上格式控制
出现问题
本题案例没问题却一直格式错误,经大佬指导,发现错误在全排列只有一种的时候没有换行。 解决方法:输出num[24]的时候判断是否是第一个数,如果是第一个数又是24号位则直接输出并换行,其他情况按一般处理。
总结
测试时多注意少数多数边界及0等特殊情况
|