bjyb


私信TA

用户名:dotcpp0610982

访问量:1950

签 名:

等  级
排  名 2084
经  验 2481
参赛次数 0
文章发表 23
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
单纯的九宫格情况只有9!=362880种,而且这个是带有限制的九宫格,情况更少,处理好重复情况搜索就行。
注意事项:
先处理出题目所示的所有情况,然后枚举目标的所有可能,看是否在题目的要求内。

旋转有顺逆时针,翻转有上下左右,共四种
参考代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
unordered_map<string,int> M;
int all[5][5];
int all1[5][5];
int MM[20];
string s;
vector<char> ss;
int ans=0;
void dfs()
{
  s.clear();
   for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
     s+=(all[i][j]+'0');
     if(M.count(s)==1) return ;
     else M[s]=1;
     //cout<<s<<"\n";

    int all2[5][5];
    for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      all2[i][j]=all[i][j];
   //顺时针旋转
   all1[1][2]=all[1][1];all1[1][3]=all[1][2];
   all1[2][3]=all[1][3];all1[3][3]=all[2][3];
   all1[3][2]=all[3][3];all1[3][1]=all[3][2];
   all1[2][1]=all[3][1];all1[1][1]=all[2][1];
   all1[2][2]=all[2][2];
   for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      all[i][j]=all1[i][j];
      dfs();
  //逆时针
     for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      all[i][j]=all2[i][j];
         
   all1[1][2]=all[1][3];all1[1][3]=all[2][3];
   all1[2][3]=all[3][3];all1[3][3]=all[3][2];
   all1[3][2]=all[3][1];all1[3][1]=all[2][1];
   all1[2][1]=all[1][1];all1[1][1]=all[1][2];
   all1[2][2]=all[2][2];
   for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      all[i][j]=all1[i][j];
      dfs();
   //上下翻转
   for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      all[i][j]=all2[i][j];
   for(int i=1;i<=3;++i)
   swap(all[1][i],all[3][i]);
   dfs();
   //左右
   for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    all[i][j]=all2[i][j];
   for(int i=1;i<=3;++i)
   swap(all[i][1],all[i][1]);
   dfs();
   //结束
    for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    all[i][j]=all2[i][j];
}
void dfs2(int i,int j)
{
   if(i==4)
   {
    s.clear();
    for(int i=1;i<=3;++i)
     for(int j=1;j<=3;++j)
      s+=(all[i][j]+'0');
      //cout<<s;
      if(M.count(s)==1) ++ans;
      if(ans==1)
      {
        for(int i=0;i<9;++i)
         ss.push_back(s[i]);
      }
    return ;
   }
   if(all[i][j]!=0)
   {
        if(j==3) dfs2(i+1,1);
        else    dfs2(i,j+1);
        return ;
   }
  for(int k=1;k<=9;++k)
   {
    if(MM[k]!=0) continue;
    all[i][j]=k;
    MM[k]=1;
    if(j==3) dfs2(i+1,1);
    else    dfs2(i,j+1);
    all[i][j]=0;
    MM[k]=0;
   }
}
 

signed main()
{
 all[1][1]=4;all[1][2]=9;all[1][3]=2;
 all[2][1]=3;all[2][2]=5;all[2][3]=7;
 all[3][1]=8;all[3][2]=1;all[3][3]=6;
 dfs();
 for(int i=1;i<=3;++i)
  for(int j=1;j<=3;++j)
   all[i][j]=0;
 for(int i=1;i<=3;++i)
  for(int j=1;j<=3;++j)
   {cin>>all[i][j];
    MM[all[i][j]]=1;}
   
   dfs2(1,1);
   int neww=-1;
  if(ans==1)
   {
    for(int i=1;i<=3;++i)
   {
   for(int j=1;j<3;++j)
   cout<<ss[++neww]<<" ";
   cout<<ss[++neww]<<"\n";
   }

   }
  else
  cout<<"Too Many";
}


 

0.0分

1 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »