プロジェクトオイラー問79

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2079
Problem 79 「パスコードの導出」 †
断片的なパスコードの入力データからもとのパスコードを推測する問題。

解法
トポロジカルソートできないならこの問題は解が複数になり成立しません。
よってトポロジカルソートで解きます。

#include<stdio.h>
#include<string.h>

bool con[10][10];
bool spents[10];

int main(){
	memset(con,false,sizeof(con));
	
	FILE *fp;
	char *fname = "pe79.txt";
	int c;
	for(int i=0;i<=9;i++){
		spents[i]=true;
	}
	
	fp = fopen( fname, "r" );
	if( fp == NULL ){
		printf( "%sファイルが開けません\n", fname );
		return -1;
	}
	char str[5];
	while(fscanf(fp,"%s",str)!=EOF){
		con[str[0]-'0'][str[1]-'0']=true;
		con[str[0]-'0'][str[2]-'0']=true;
		con[str[1]-'0'][str[2]-'0']=true;
		for(int i=0;i<3;i++)spents[str[i]-'0']=false;
	}
	fclose(fp);
	int count=0;
	for(int i=0;i<10;i++){
		count+=(spents[i]==false);
	}
	for(int i=0;i<count;i++){
		for(int j=0;j<=9;j++){
 			if(spents[j]==false){
				int bad=0;
				for(int k=0;k<=9;k++){
				bad+=(con[k][j]==true);
 				}
				if(bad==0){
					printf("%d",j);
					spents[j]=true;
					for(int k=0;k<=9;k++){
						con[j][k]=false;
					}
					break;
 				}
			}
		}
	}
}
最終更新:2014年12月12日 21:05