记录编号 |
52105 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2003]木棒游戏 |
最终得分 |
100 |
用户昵称 |
QhelDIV |
是否通过 |
通过 |
代码语言 |
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;
}