您的位置:首页 > 其它

2017.1.16【初中部 】普及组模拟赛C组 match 题解

2017-01-16 17:22 387 查看

原题:

http://172.16.0.132/junior/#contest/show/1366/1

题目描述:

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

输入:

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

输出:

如果找不到方案,输出“0”(不包含引号)

如果能找到,输出包含3行,第i行对应九宫格的第i行(最后一行行末要换行)。

如果有多种方案,请输出每种方案对应的字符串中字典序最前的一种(将行与行首尾相连,就可以得到一个字符串)。

样例输入:

样例输入1:

ANA

ANA

DAR

DAR

RAD

RAD

样例输入2:

EVO

HEP

HIR

IVA

PAD

ROD

样例输入3:

AKO

CES

DOC

DON

ESI

KES

样例输出:

样例输出1:

DAR

ANA

RAD

样例输出2:

HEP

IVA

ROD

样例输出3:

0

数据范围限制:

如果找不到方案,输出“0”(不包含引号)

分析:

这道题目我们可以爆搜,当然不能每个位置搜,这样会爆,所以我们可以分层搜;

先将单词从小到大排序(题目要求要满足字典最小序),然后x表示当前搜到第x层,当x>3时,我们判断对于每一列是否存在这样一个单词(因为我们是按层来搜的,所以不用担心每一行的单词不存在)

实现:

var
s,ans:array[0..1000]of string;
w:string;
i,j,t:longint;
bz,r:array[0..1000]of boolean;
b:boolean;
function check:boolean;
begin
r:=bz;
for i:=1 to 3 do
begin
w:='';
b:=false;
for j:=1 to 3 do w:=w+ans[j,i];
for j:=1 to 6 do
if (w=s[j])and(r[j]) then
begin
b:=true;
r[j]:=false;
break;
end;
if b=false then exit(false);
end;
exit(true);
end;
procedure dg(x:longint);
var
i,t:longint;
begin
if x>3 then
begin
if check then
begin
for t:=1 to 3 do writeln(ans[t]);
halt;
end;
exit;
end;
for i:=1 to 6 do
if bz[i] then
begin
bz[i]:=false;
ans[x]:=s[i];
dg(x+1);
bz[i]:=true;
ans[x]:='';
end;
end;
procedure qsort(x,y:longint);
var
i,j:longint;
mid:string;
begin
i:=x;
j:=y;
mid:=s[x];
repeat
while s[j]>mid do dec(j);
while s[i]<mid do inc(i);
if i<=j then
begin
s[0]:=s[i];
s[i]:=s[j];
s[j]:=s[0];
inc(i);
dec(j);
end;
until i>j;
if x<j then qsort(x,j);
if i<y then qsort(i,y);
end;
begin
assign(input,'match.in');reset(input);
assign(output,'match.out');rewrite(output);
fillchar(bz,sizeof(bz),true);
for i:=1 to 6 do readln(s[i]);
qsort(1,6);
dg(1);
writeln(0);
close(input);close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: