记录编号 |
42440 |
评测结果 |
AAAAAAATAA |
题目名称 |
[NOIP 2004]虫食算 |
最终得分 |
90 |
用户昵称 |
Truth.Cirno |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
0.137 s |
提交时间 |
2012-09-24 21:03:34 |
内存使用 |
0.29 MiB |
显示代码纯文本
#include <cstdio>
using namespace std;
int n,a[3][30]={0},rul[30];
bool used[30],found=false;
void dfs(int which,int pos,int jin)
{
int i;
if (pos<0)
{
if (jin)
return;
found=true;
for (i=0;i<n-1;i++)
printf("%d ",rul[i]);
printf("%d\n",rul[n-1]);
return;
}
if (which==0)
{
if (rul[a[0][pos]]==-1)
{
for (i=n-1;i>=0;i--)
{
if (!used[i])
{
rul[a[0][pos]]=i;
used[i]=true;
dfs(1,pos,jin);
if (found)
return;
rul[a[0][pos]]=-1;
used[i]=false;
}
}
}
else
{
dfs(1,pos,jin);
if (found)
return;
}
}
else if (which==1)
{
if (rul[a[1][pos]]==-1)
{
for (i=n-1;i>=0;i--)
{
if (!used[i])
{
rul[a[1][pos]]=i;
used[i]=true;
dfs(2,pos,jin);
if (found)
return;
rul[a[1][pos]]=-1;
used[i]=false;
}
}
}
else
{
dfs(2,pos,jin);
if (found)
return;
}
}
else// if (which==2)
{
int temp;
temp=rul[a[0][pos]]+rul[a[1][pos]]+jin;
if (rul[a[2][pos]]==-1)
{
for (i=n-1;i>=0;i--)
{
if (!used[i]&&temp%n==i)
{
rul[a[2][pos]]=i;
used[i]=true;
dfs(0,pos-1,temp/n);
if (found)
return;
rul[a[2][pos]]=-1;
used[i]=false;
}
}
}
else
{
if (temp%n==rul[a[2][pos]])
{
dfs(0,pos-1,temp/n);
if (found)
return;
}
}
}
}
int main(void)
{
freopen("alpha.in","r",stdin);
freopen("alpha.out","w",stdout);
int i;
char cha[30]={0},chb[30]={0},chc[30]={0};
scanf("%d\n",&n);
scanf("%s\n%s\n%s\n",&cha,&chb,&chc);
for (i=0;i<n;i++)
{
a[0][i]=cha[i]-'A';
a[1][i]=chb[i]-'A';
a[2][i]=chc[i]-'A';
rul[i]=-1;
}
dfs(0,n-1,0);
return(0);
}