HDU 2931 Digit Puzzle 搜索 DFS

#include<cstdio>
#include<cstring>

int num[3],tot,n,f;
char s[3][100],ans[3][100];

int check()
{
	char str[100];
	int a=0,b=0,c;
	for(int i=0;i<num[0];i++)
		a=a*10+s[0][i]-'0';
	for(int i=0;i<num[1];i++)
		b=b*10+s[1][i]-'0';
	c=a*b;
	for(int i=num[2]-1;i>=0;i--)
	{
		str[i]='0'+c%10;
		c/=10;
	}
	if(c>0||str[0]=='0')
		return 0;
	for(int i=0;i<num[2];i++)
		if(s[2][i]!=str[i]&&s[2][i]!='*')
			return 0;
	return 1;
}

void dfs(int a,int b)
{
	if(b>=num[a])
	{
		b=0;
		a++;
	}
	if(a==2)
	{
		if(check())
			tot++;
		return;
	}
	if(s[a][b]!='*')
		dfs(a,b+1);
	else
	{
		for(int i=0;i<10;i++)
		{
			if(b==0&&i==0)
				continue;
			s[a][b]='0'+i;
			dfs(a,b+1);
			if(tot>1)
			{
				s[a][b]='*';
				return;
			}
		}
		s[a][b]='*';
	}
}

void search(int a,int b,int c)
{
	if(b>=num[a])
	{
		b=0;
		a++;
	}
	if(c==n)
	{
		tot=0;
		dfs(0,0);
		if(tot==1)
		{
			f=1;
			for(int i=0;i<3;i++)
				strcpy(ans[i],s[i]);
		}
		return;
	}
	if(a>=3)
		return;
	char ch=s[a][b],tc;
	for(int i=0;i<=10;i++)
	{
		if(i==1&&b==0)
			continue;
		if(!i)
			tc='*';
		else
			tc='0'+i-1;
		if(tc==s[a][b])
			search(a,b+1,c);
		else
		{
			s[a][b]=tc;
			search(a,b+1,c+1);
		}
		if(f)
		{
			s[a][b]=ch;
			return;
		}
		s[a][b]=ch;
	}
}

void work()
{
	int m=0;
	for(int i=0;i<3;i++)
		m+=num[i];
	for(n=1;n<=m;n++)
	{
		f=0;;
		search(0,0,0);
		if(f)
			return;
	}
}

int main()
{
	int cas=1;
	memset(s,0,sizeof(s));
	while(scanf("%s",s[0])&&s[0][0]!='0')
	{
		scanf("%s%s",s[1],s[2]);
		for(int i=0;i<3;i++)
			num[i]=strlen(s[i]);
		tot=0;
		dfs(0,0);
		printf("Case %d: ",cas++);
		if(tot==1)
			printf("%s %s %s\n",s[0],s[1],s[2]);
		else
		{
			work();
			printf("%s %s %s\n",ans[0],ans[1],ans[2]);
		}
		memset(s,0,sizeof(s));
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 23:11:48

HDU 2931 Digit Puzzle 搜索 DFS的相关文章

Dearboy&#39;s Puzzle (poj 2308 搜索 dfs+bfs)

Language: Default Dearboy's Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1202   Accepted: 208 Description Dearboy is a game lover. Recently, he loves playing the game Lian Lian Kan. This game is played on a board with N*M grids

HDU 2553 N皇后问题 (搜索DFS)

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7743    Accepted Submission(s): 3481 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求

HDU 4937 Lucky Number 搜索

题意: 给你一个数,求在多少种不同的进制下这个数每一位都是3.4.5.6中的一个. 思路: 搜索.枚举这个数在任意进制下的表示,判断是否合法.当数字只有3.4.5.6时,必定有无穷种. 因为数字太大,所以直接枚举必定会超时. 下面有两种剪枝的方法: 1. 先枚举最后一位的情况. 假设数字n在base进制下表示为 a[n]...a[0],即 n = a[0] + a[1]*base^1 + ... + a[n]*base^n. 则 n - a[0] = a[1]*base^1 + ... + a[

HDU 1078 记忆化搜索

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4575 Accepted Submission(s): 1829 Problem Description FatMouse has stored some cheese in a city. The city can be considered as a

hdu 1241 Oil Deposits(DFS求连通块)

HDU 1241  Oil Deposits L -DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rec

朴素搜索dfs, 简单的剪枝搜索

为做一个项目选择最合适的语言固然重要,但是,掌握一门自己熟练的兵器,也很重要. ===================================================================================================================== 继续总结搜索类的题目,这一类的题目,目前仅分析简单粗暴的dfs搜索,以及简单的剪枝. 参考的题目: http://acm.hdu.edu.cn/showproblem.php?pid=

HDU 哈密顿绕行世界问题 (dfs)

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

HDU 1241 Oil Deposits --- 入门DFS

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1241 /* HDU 1241 Oil Deposits --- 入门DFS */ #include <cstdio> int m, n; //n行m列 char mapp[105][105]; /* 将和i,j同处于一个连通块的字符标记出来 */ void dfs(int i, int j){ if (i < 0 || j < 0 || i >= n || j >= m

hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~

题目: 链接:点击打开链接 题意: 输入n个点,要求选m个点满足连接m个点的m-1条边权值和sum与点的权值和ans使得sum/ans最小,并输出所选的m个点,如果有多种情况就选第一个点最小的,如果第一个点也相同就选第二个点最小的........ 思路: 求一个图中的一颗子树,使得Sum(edge weight)/Sum(point weight)最小~ 数据量小,暴力枚举~~~~~dfs暴力枚举C(M,N)种情况. 枚举出这M个点之后,Sum(point weight)固定,进行prim或者K