【天梯赛】L1-104 九宫格(C++)
易忽略的错误:开始习惯性地看到n就以为是n*n数组了,实际上应该是9*9的固定大小数组,查了半天没查出来
题面
L1-104 九宫格 - 团体程序设计天梯赛-练习集
代码实现
#include<bits/stdc++.h>
using namespace std;
//易错:开始习惯性地看到n就以为是n*n数组了
int main()
{
int direct[8][2] = {
{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int n; cin>>n;
vector<vector<int>>graph(9, vector<int>(9));//开始习惯性地看到n就以为是n*n数组了
vector<int>res;
int flag = 1;
set<int>st;
//全部放在一个大for中就好了
for(int m=0; m<n; m++)
{
//接收和检验每行
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
cin>>graph[i][j];
if(graph[i][j]<1 || graph[i][j]>9) flag = 0;//数字均为1~9
st.insert(graph[i][j]);
}
if(st.size() != 9) flag = 0;//每行的检验
st.clear();
}
//每列
for(int j=0; j<9 && flag != 0; j++)
{
for(int i=0; i<9; i++)
{
st.insert(graph[i][j]);
}
if(st.size()!=9)
{
flag = 0; break;
}
}
//每宫格
for(int i=1; i<9 && flag != 0; i+=3)
{
for(int j=1; j<9 && flag != 0; j+=3)//每宫格的中心点
{
st.clear();
st.insert(graph[i][j]);
for(int k=0; k<8; k++)
{
st.insert(graph[i+direct[k][0]][j+direct[k][1]]);
}
if(st.size()!=9)
{
flag = 0; break;
}
}
}
st.clear();
res.push_back(flag);
flag = 1;
}
for(int i=0; i<res.size(); i++)
{
cout<<res[i];
if(i!=res.size()-1) cout<<endl;
}
return 0;
}