P8296 [COCI2012-2013#2] KRIZALJKA

· · 题解

这里是蒟蒻第一次写题解,有错误请多多指教。

思路

第一眼一看就是黄题搜索,再一看,其实是一道普通的模拟。

采用4重循环的方法:

  1. 前三重循环枚举三给不同的字符串。
  2. 将字符串组合。
  3. 最后一个循环判断字符串是否成立。

注:因为输入是按字典序,所以不用再排序。

样例模拟

1. ANA
2. ANA
3. DAR
4. DAR
5. RAD
6. RAD

可以写成:

  3 1 5
4 D A R
2 A N A
6 R A D

代码

#include<bits/stdc++.h>
using namespace std;
int n=6;//这里n均为6
string a[10];
int main()
{
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)//枚举三个数
            {
                if(i==j||j==k||k==i)//判重
                {
                    continue;
                }
                string x;
                x=x+a[i][0]+a[j][0]+a[k][0];
                string y;
                y=y+a[i][1]+a[j][1]+a[k][1];
                string z;
                z=z+a[i][2]+a[j][2]+a[k][2];
                //分别令 x,y,z 为第一列,第二列,第三列
                bool f1=0,f2=0,f3=0;
                //成功的就可以标记
                for(int l=1;l<=n;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    if(a[l]==x&&!f1)//会有重复的记得判重
                    {
                        f1=1;
                    }
                    else if(a[l]==y&&!f2)//同上
                    {
                        f2=1;
                    }
                    else if(a[l]==z)
                    {
                        f3=1;
                    }
                }
                if(f1&&f2&&f3)//成功了直接输出,并结束
                {
                    cout<<a[i]<<endl;
                    cout<<a[j]<<endl;
                    cout<<a[k]<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<0<<endl;//未成功的输出0
    return 0;
}

这样就可以AC啦。