记录编号 83669 评测结果 AAAAAAAAAAAA
题目名称 二五语言 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 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;
}