貝殼找房 丟失的卡片

 

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;

int b[100];
int total=0;
int n=10;
set<int> sss;

void dfs(int t)
{
    int i,temp;
    if(t==total-1)
    {	
    	int zzz=0;
        for(i=0;i<total;i++)
        	zzz=b[i]+zzz*10;
        if(zzz<=n&&b[0]!=0){
        	sss.insert(zzz);
//        	cout<<zzz<<endl;
		}
    }else
    {
        for(i=t;i<total;i++)
        {
            temp=b[i],b[i]=b[t],b[t]=temp;
            dfs(t+1);
            temp=b[i],b[i]=b[t],b[t]=temp;//恢復原狀
        }
    }
}


int main()
{
	
	int a[10];
	int sum=0;
	for(int i=0;i<n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	if(sum==0){
		cout<<"NO ANSWER";
		return 0;
	} 
	sum=sum+1;
//	cout<<sum<<endl;
	int temp=9,temp2=1;
	n=0;
	int x=0;
	for(int i=1;i<100;i++)
	{
		if(sum-temp>0){
			sum-=temp;
			temp*=10;
			sum+=1;
			for(int j=1;j<=9;j++){
				a[j]--;
//				cout<<a[j]<<' ';
			}
//			cout<<endl; 
			temp2*=10;
		}
		else{
//			cout<<sum<<endl;
			int kk=sum%i;
			while(kk){
				temp2/=10;
				kk--;
			}
			n=sum/i+temp/10;
			
			int flag=0;
			for(int j=temp2;j<=n;j++){
				int temp3=j;
//				for(int k=0;k<=9;k++) cout<<a[k]<<' ';
//				cout<<endl;
//				if(flag==1) break;
				while(temp3){
					
					if(a[temp3%10]-1<0){
//						cout<<temp3%10<<endl;
						b[total++]=temp3%10;
//						s.insert(j);
//						break;
					}
					else a[temp3%10]--;
					temp3/=10;
				}
			}
			break;
		}
	}

	if(total==0){
		cout<<"NO ANSWER";
		return 0;
	}
	dfs(0);
	set<int>::iterator iter=sss.begin();
    while(iter!=sss.end())
    {
        cout<<n<<' '<<*iter<<endl;
        ++iter;
    }
	return 0;
}

/*


0 1 1 0 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

2 12 9 3 3 3 3 2 2 2 

2 11 10 3 3 3 3 2 2 2 
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章