3639: match
时间限制: 1 Sec 内存限制: 128 MB提交: 95 解决: 36
[ 提交][ 状态][ 讨论版]
题目描述
小 x 在解说 F7 决赛时的搭档是韩乔生,以至于小 x 没有任何能说上话的机会。无聊的他玩起了填字游戏。一个 3*3 的九宫格里,每个格子里都被填上了一个字母,从而我们得到了 6 个单词。现在,小 x 随手写了 6 个单词,他想让你帮他找到一种填字母的方案,使得这 6 个单词都出现在了九宫格里。
输入
共六行,每行一个长度为 3 的单词(全部大写)。
输出
如果找不到方案,输出“0”(不包含引号)
如果能找到,输出包含 3 行,第 i 行对应九宫格的第 i 行(最后一行行末要换行)。
如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。
如果能找到,输出包含 3 行,第 i 行对应九宫格的第 i 行(最后一行行末要换行)。
如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。
样例输入
ANA
ANA
DAR
DAR
RAD
RAD
样例输出
DAR
ANA
RAD
提示
来源
ac代码
#include <stdio.h>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
char a[6][5];
int vis[6];
int z;
char yy[20];
char ans[6][5];
int shutsown=0;
void sorts(){
for(int i=0;i<5;i++)
{
for(int j=i+1;j<6;j++)
{
char tmp[20];
if(strcmp(a[i],a[j]) > 0)
{
strcpy(tmp,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],tmp);
}
}
}
}
void print(){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%c",ans[i][j]);
}
printf("\n");
}
}
bool judge(){
char tmp[6][5];
strcpy(tmp[0],ans[0]);
strcpy(tmp[1],ans[1]);
strcpy(tmp[2],ans[2]);
int z=3;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
tmp[i+3][j]=ans[j][i];
}
tmp[i+3][4]='\0';
z++;
}
int flag;
int t_vis[6];
memset(t_vis,0,sizeof(t_vis));
for(int i=0;i<6;i++ ){
flag=0;
for(int j=0;j<6;j++){
if(!t_vis[j] && a[i][0]==tmp[j][0] && a[i][1]==tmp[j][1] && a[i][2]==tmp[j][2]){
flag=1;
t_vis[j]=1;
break ;
}
}
if(!flag)
return false;
}
return true;
}
void dfs(int n){
if(shutsown)
return ;
if(n>=3){
if(judge()){
print();
shutsown=1;
return ;
}
}
for(int i=0;i<6;i++){
if(!vis[i]){
strcpy(ans[n],a[i]);
vis[i]=1;
dfs(n+1);
vis[i]=0;
}
}
}
int main()
{
while(~scanf("%s",a[0])){
for(int i=1;i<6;i++){
scanf("%s",a[i]);
}
sorts();
memset(vis,0,sizeof(vis));
shutsown=0;
dfs(0);
if(!shutsown)
printf("0\n");
}
return 0;
}