中石油集训 match

来源:互联网 发布:测跑分的软件 编辑:程序博客网 时间:2024/06/10 09:08

3639: match

时间限制: 1 Sec  内存限制: 128 MB
提交: 95  解决: 36
[提交][状态][讨论版]

题目描述

小 x 在解说 F7 决赛时的搭档是韩乔生,以至于小 x 没有任何能说上话的机会。无聊的他玩起了填字游戏。一个 3*3 的九宫格里,每个格子里都被填上了一个字母,从而我们得到了 6 个单词。现在,小 x 随手写了 6 个单词,他想让你帮他找到一种填字母的方案,使得这 6 个单词都出现在了九宫格里。

输入

共六行,每行一个长度为 3 的单词(全部大写)。

输出

如果找不到方案,输出“0”(不包含引号)
如果能找到,输出包含 3 行,第 i 行对应九宫格的第 i 行(最后一行行末要换行)。
如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。

样例输入

ANAANADARDARRADRAD

样例输出

DARANARAD

提示

来源

宁波市第31届中小学程序设计比赛模拟试题



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;}