记录编号 52105 评测结果 AAAAAAAAAA
题目名称 [NOI 2003]木棒游戏 最终得分 100
用户昵称 GravatarQhelDIV 是否通过 通过
代码语言 C++ 运行时间 0.091 s
提交时间 2013-01-13 11:16:09 内存使用 2.96 MiB
显示代码纯文本
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <stdio.h>
using namespace std;
ifstream fin("stickgame.in");
ofstream fout("stickgame.out");
string S;
bool flag,legal[3000];
int RInsert[10][4],RDelete[10][4],RIDself[10][4];
int CE[3000];
/*
Num		6 2 5 5 4 5 6 3 7 6

		0 1 2 3 4 5 6 7 8 9
Insert	1 1 0 1 0 2 1 0 0 1
		8 7   9   6 8	  8
				  9

Delete	0 0 0 0 0 0 1 1 3 2
					5 1 6 3
						9 5
						0

IDself  2 0 1 2 0 1 1 0 0 1 
		6   3 2   3 9	  6
		9     5
*/
void Initialize()
{
int i=1,L;
	for(i=0;i<1000;i++)
		CE[i]=1;
	fin>>S;
	while(S[S.length()-1]!='#')
		S.erase(S.length()-1,1);
	S.erase(S.length()-1,1);
	RInsert[0][0]=1;RInsert[1][0]=1;RInsert[3][0]=1;RInsert[5][0]=2;RInsert[6][0]=1;RInsert[9][0]=1;
	RInsert[0][1]=8;RInsert[1][1]=7;RInsert[3][1]=9;RInsert[5][1]=6;RInsert[6][1]=8;RInsert[9][1]=8;
													RInsert[5][2]=9;
	RDelete[6][0]=1;RDelete[7][0]=1;RDelete[8][0]=3;RDelete[9][0]=2;
	RDelete[6][1]=5;RDelete[7][1]=1;RDelete[8][1]=0;RDelete[9][1]=3;
									RDelete[8][2]=9;RDelete[9][2]=5;
									RDelete[8][3]=6;
	RIDself[0][0]=2;RIDself[2][0]=1;RIDself[3][0]=2;RIDself[5][0]=1;RIDself[6][0]=2;RIDself[9][0]=2;
	RIDself[0][1]=6;RIDself[2][1]=3;RIDself[3][1]=2;RIDself[5][1]=3;RIDself[6][1]=3;RIDself[9][1]=6;
	RIDself[0][2]=9;				RIDself[3][2]=5;				RIDself[6][2]=0;RIDself[9][2]=0;
//Figue legal situation	
	L=S.length();
	istringstream sin(S);
int a,b;
	sin>>a;
	for(i=0;i<sin.tellg();i++)
		legal[i]=true;
	while(!sin.eof())
	{
	int pos,now;
		b=a;
		sin.ignore();
		pos=sin.tellg() ;
		sin>>a;
		now=sin.tellg();now--;
		if(now<0)
			now=S.length()-1;
		if(a!=b)
			for(i=pos;i<=now;i++)
				legal[i]=true;
	}
}
bool Check()
{
int CE,Cinit=1,Sum=0,Nd;char C=' ';
	istringstream sin(S);
	while(!sin.eof())
	{
		while(!sin.eof() && (sin.peek()<'0' || sin.peek()>'9'))
		{
			sin>>C;
			if(C=='=')
				Cinit=-1;
		}
		CE=Cinit;
		if(C=='-')
			CE=-Cinit;
		sin>>Nd;
		Sum+=CE*Nd;
	}
	if(Sum==0)	return true;
	else		return false;
}
bool OSquare()
{
int i,j,k,l,L=S.length();char C;
	for(i=0;i<L;i++)
		if(legal[i])
		if(S[i]>='0' && S[i]<='9')
			for(j=1;j<=RIDself[S[i]-'0'][0];j++)
			{
				C=S[i];
				S[i]=char('0'+RIDself[S[i]-'0'][j]);
				if(Check())
				{
					fout<<S+"#"<<endl;
					return true;
				}
				S[i]=C;
			}
			
	for(i=0;i<L;i++)
		if(legal[i])
	{
		if(S[i]>='0' && S[i]<='9')
		for(j=0;j<L;j++)
			if(legal[j] && S[i]!=S[j] && S[j]>='0' && S[j]<='9')
				for(k=1;k<=RInsert[S[i]-'0'][0];k++)
				{
				char T1=S[i],T2;
					S[i]=char('0'+RInsert[S[i]-'0'][k]);
					for(l=1;l<=RDelete[S[j]-'0'][0];l++)
					{
						T2=S[j];
						S[j]=char('0'+RDelete[S[j]-'0'][l]);
						if(Check())
						{
							fout<<S+"#"<<endl;
							return true;
						}
						S[j]=T2;
					}
					S[i]=T1;
				}
	}
	return false;
}
int main()
{
	Initialize();
	
	if(!OSquare())
		fout<<"No"<<endl;
	
	fin.close();
	fout.close();
	return 0;
}