记录编号 |
83669 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
二五语言 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.016 s |
提交时间 |
2013-12-05 14:48:57 |
内存使用 |
0.35 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<queue>
using namespace std;
const int SIZEN=6;
const int SIZESTATE=60000;
int f[SIZEN][SIZEN][SIZEN][SIZEN][SIZEN]={0};
char board[SIZEN][SIZEN]={0};//确定为哪个,若未确定就是0
void printboard(void){//调试接口,输出board
int i,j;
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
if('A'<=board[i][j]&&board[i][j]<='Z') cout<<board[i][j];
else cout<<"0";
}
cout<<endl;
}
}
class STATE{
public:
int s[SIZEN];
int value(void){
return f[s[1]][s[2]][s[3]][s[4]][s[5]];
}
void assign(int x){
f[s[1]][s[2]][s[3]][s[4]][s[5]]=x;
}
bool able_place(int x,int deep){
if(x>1&&s[x-1]<=s[x]) return false;
if(x==1&&s[x]>=5) return false;
if(board[x][s[x]+1]&&board[x][s[x]+1]!=deep+'A') return false;
return true;
}
};
int DFS(STATE st,int deep){
if(st.value()!=-1) return st.value();
int ans=0;
int i;
for(i=1;i<=5;i++){
if(st.able_place(i,deep)){
st.s[i]++;
ans+=DFS(st,deep+1);
st.s[i]--;
}
}
st.assign(ans);
return ans;
}
int calc(void){
memset(f,-1,sizeof(f));
f[5][5][5][5][5]=1;
return DFS((STATE){0,0,0,0,0},0);
}
void go_N(void){
int i,j;
int temp;
int n;
scanf("%d",&n);
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
for(board[i][j]='A';(temp=calc())<n;board[i][j]++) n-=temp;
printf("%c",board[i][j]);
}
}
printf("\n");
}
void go_W(void){
string str;
cin>>str;
int i,j,k,tot=0,ans=0;
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
for(board[i][j]='A';board[i][j]<str[tot];board[i][j]++) ans+=calc();
tot++;
}
}
ans++;
printf("%d\n",ans);
}
int main(){
freopen("twofive.in","r",stdin);
freopen("twofive.out","w",stdout);
char cmd;
cin>>cmd;
if(cmd=='W') go_W();
else go_N();
return 0;
}