Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

累死我了,做这题。一个较为容易理解的思路

Posted by conan614 at 2010-03-23 22:21:00 on Problem 1128
dfs(位置)
{
 满足'矩形'条件的字母,记录。然后把它所占位置置为'.'。
 结果[总长-位置-1];//从后面开始,这样满足条件
  dfs(位置+1);
}
核心代码
void dfs(int k)
{
	char **temp;
	temp=new char*[h];//存储用*代替位置的数组情况
	for(int i=0;i<h;i++)
	{
		temp[i]=new char[w];
	}
	if(k==number)//当前这种情况处理结束了,赋值,然后site加一
	{
		result[site]=str;
		site++;
		return;
	}
	//判断当前的字母是否可以构成矩形
	for(int i=0;i<26;i++)
	{
		if(letter[i]==0||letter[i]==2)//如果这种字母不存在,或者已经处理过了,0是不存在,2是处理过了。
			continue;
		if(judge(sx[i],sy[i],ex[i],ey[i],i+'A')==0)//如果返回的是0,满足条件。返回1,说明不是矩形。
		{
			for(int m=0;m<h;m++)
			{
				for(int j=0;j<w;j++)
				{
					temp[m][j]=store[m][j];//给temp数组赋值
					if(store[m][j]-'A'==i)//将处理过的字母变成*
						store[m][j]='.';
				}
			}
			letter[i]=2;//已经用过了,将其处理了。
			str[number-k-1] = 'A' + i;//将得到的值赋到str字符数组中,最先出现的字母应该放到后面的位置
			dfs(k+1);//找下一个位置了,从后面数
			//不满足条件后,要恢复没有变化的情况
			letter[i]=1;
			for(int m=0;m<h;m++)
			{
				for(int j=0;j<w;j++)
				{
					store[m][j]=temp[m][j];//把值重新付回去
				}
			}
		}
	}
	//如果构成了,则把这些位置变成*,然后把letter所表示的位置改了
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator