2021.11.2-测试T1数独
数 独
【问题描述】
给定一个9*9矩阵,对其进行几种操作,分别是插入,删除,合并,查询,输出
主要学到了一些特别的操作。
(1)备份( 本蒟蒻第一次了解到)
(2)对与数据的一些特别的改动
(3)进行标记
这道题目,直接模拟就可以了,但要注意细节以及一些很妙的操作:
首先是字符组的存入:注意将其他的字符进行排除:
1 for(int i=1;i<=19;i++){
2 cin>>s;
3 if(i&1)continue;//奇数
4 for(int j=1;j<=9;j++)
5 c[0][i/2][j]=s[j*2-1];
6 }
然后就是分类讨论:
char c[105][10][10];//前面用于备份每一次操作后的数独(第一次看到这种操作,太强了)
cin>>T;
for(int i=1;i<=T;i++){
cin>>s;
if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k);//in:快读{i记录每一次操作}
else if(s[0]=='D')x=in,y=in,del(i,x,y);
else if(s[0]=='Q')x=in,y=in,query(i,x,y);
else if(s[0]=='M')x=in,y=in,merge(i,x,y);
else print(i);
}
1:插入:
1 void insert(int n,int x,int y,int k){
2 for(int i=1;i<=9;i++)
3 for(int j=1;j<=9;j++)
4 c[n][i][j]=c[n-1][i][j];//备份
5 if(c[n][x][y]!='0'){
6 cout<<"Error!"<<endl;
7 return;
8 }
9 for(int i=1;i<=9;i++)
10 if(c[n][x][i]==k+'0'){
11 cout<<"Error:row!"<<endl;
12 return;//冲突1
13 }
14 for(int i=1;i<=9;i++)
15 if(c[n][i][y]==k+'0'){
16 cout<<"Error:column!"<<endl;
17 return;//冲突2
18 }
19 int gg=(x-1)/3*3+(y-1)/3+1;
20 for(int i=0;i<=2;i++)
21 for(int j=0;j<=2;j++)
22 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){
23 cout<<"Error:square!"<<endl;
24 return;//冲突3
25 }
26 cout<<"OK!"<<endl;
27 c[n][x][y]=k+'0';
28 }
2:删除:
1 void del(int n,int x,int y){
2 for(int i=1;i<=9;i++)
3 for(int j=1;j<=9;j++)
4 c[n][i][j]=c[n-1][i][j];//注意备份
5 if(c[n][x][y]=='0')
6 cout<<"Error!"<<endl;
7 else{
8 cout<<"OK!"<<endl;
9 c[n][x][y]='0';
10 }
11 }
3:查询:
1 int can[10],ans;
2 void query(int n,int x,int y){
3 for(int i=1;i<=9;i++)
4 for(int j=1;j<=9;j++)
5 c[n][i][j]=c[n-1][i][j];
6 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;}
7 memset(can,0,sizeof(can));ans=0;
8 int gg=(x-1)/3*3+(y-1)/3+1;
9 for(int i=1;i<=9;i++)
10 can[c[n][x][i]-'0']=1;
11 for(int i=1;i<=9;i++)
12 can[c[n][i][y]-'0']=1;
13 for(int i=0;i<=2;i++)
14 for(int j=0;j<=2;j++)
15 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1;//记录不满足的数(因为冲突)
16 for(int i=1;i<=9;i++)
17 if(!can[i]) ans++;
18 cout<<ans<<endl;
19 for(int i=1;i<=9;i++)
20 if(!can[i]) cout<<i<<endl;
21 }
4:合并:
1 int ansx,ansy;
2 void merge(int n,int x,int y){
3 for(int i=1;i<=9;i++)
4 for(int j=1;j<=9;j++){
5 int flag=0;
6 if(c[x][i][j]!='0'){
7 flag=1;
8 for(int k=1;k<=9;k++)
9 if(c[n][i][k]==c[x][i][j]){
10 flag=0;break;
11 }
12 for(int k=1;k<=9;k++)
13 if(c[n][k][j]==c[x][i][j]){
14 flag=0;break;
15 }
16 int wh=(i-1)/3*3+(j-1)/3+1;
17 for(int l=0;l<=2;l++)
18 for(int r=0;r<=2;r++)
19 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){
20 flag=0;break;
21 }
22 }
23 if(flag){
24 c[n][i][j]=c[x][i][j];
25 ansx++;
26 continue;
27 }
28 if(c[y][i][j]!='0'){
29 flag=1;
30 for(int k=1;k<=9;k++)
31 if(c[n][i][k]==c[y][i][j]){
32 flag=0;break;
33 }
34 for(int k=1;k<=9;k++)
35 if(c[n][k][j]==c[y][i][j]){
36 flag=0;break;
37 }
38 int wh=(i-1)/3*3+(j-1)/3+1;
39 for(int l=0;l<=2;l++)
40 for(int r=0;r<=2;r++)
41 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){
42 flag=0;break;
43 }
44 }
45 if(flag){
46 c[n][i][j]=c[y][i][j];
47 ansy++;
48 continue;
49 }
50 c[n][i][j]='0';
51 }
52 cout<<ansx<<" "<<ansy<<endl;
53 ansx=0,ansy=0;//注意多次操作要恢复
54 }
总代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define int long long
4 #define in read()
5 inline int read(){
6 int p=0,f=1;
7 char c=getchar();
8 while(!isdigit(c)){
9 if(c=='-')f=-1;
10 c=getchar();
11 }
12 while(isdigit(c)){
13 p=p*10+c-'0';
14 c=getchar();
15 }
16 return p*f;
17 }
18 char c[105][10][10];
19 string s;
20 int xs[10]={0,1,1,1,4,4,4,7,7,7};
21 int ys[10]={0,1,4,7,1,4,7,1,4,7};
22 void insert(int n,int x,int y,int k){
23 for(int i=1;i<=9;i++)
24 for(int j=1;j<=9;j++)
25 c[n][i][j]=c[n-1][i][j];
26 if(c[n][x][y]!='0'){
27 cout<<"Error!"<<endl;
28 return;
29 }
30 for(int i=1;i<=9;i++)
31 if(c[n][x][i]==k+'0'){
32 cout<<"Error:row!"<<endl;
33 return;
34 }
35 for(int i=1;i<=9;i++)
36 if(c[n][i][y]==k+'0'){
37 cout<<"Error:column!"<<endl;
38 return;
39 }
40 int gg=(x-1)/3*3+(y-1)/3+1;
41 for(int i=0;i<=2;i++)
42 for(int j=0;j<=2;j++)
43 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){
44 cout<<"Error:square!"<<endl;
45 return;
46 }
47 cout<<"OK!"<<endl;
48 c[n][x][y]=k+'0';
49 }
50 void del(int n,int x,int y){
51 for(int i=1;i<=9;i++)
52 for(int j=1;j<=9;j++)
53 c[n][i][j]=c[n-1][i][j];
54 if(c[n][x][y]=='0')cout<<"Error!"<<endl;
55 else{cout<<"OK!"<<endl;c[n][x][y]='0';}
56 }
57 int can[10],ans;
58 void query(int n,int x,int y){
59 for(int i=1;i<=9;i++)
60 for(int j=1;j<=9;j++)
61 c[n][i][j]=c[n-1][i][j];
62 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;}
63 memset(can,0,sizeof(can));ans=0;
64 int gg=(x-1)/3*3+(y-1)/3+1;
65 for(int i=1;i<=9;i++)
66 can[c[n][x][i]-'0']=1;
67 for(int i=1;i<=9;i++)
68 can[c[n][i][y]-'0']=1;
69 for(int i=0;i<=2;i++)
70 for(int j=0;j<=2;j++)
71 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1;
72 for(int i=1;i<=9;i++)
73 if(!can[i]) ans++;
74 cout<<ans<<endl;
75 for(int i=1;i<=9;i++)
76 if(!can[i]) cout<<i<<endl;
77 }
78 int ansx,ansy;
79 void merge(int n,int x,int y){
80 for(int i=1;i<=9;i++)
81 for(int j=1;j<=9;j++){
82 int flag=0;
83 if(c[x][i][j]!='0'){
84 flag=1;
85 for(int k=1;k<=9;k++)
86 if(c[n][i][k]==c[x][i][j]){
87 flag=0;break;
88 }
89 for(int k=1;k<=9;k++)
90 if(c[n][k][j]==c[x][i][j]){
91 flag=0;break;
92 }
93 int wh=(i-1)/3*3+(j-1)/3+1;
94 for(int l=0;l<=2;l++)
95 for(int r=0;r<=2;r++)
96 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){
97 flag=0;break;
98 }
99 }
100 if(flag){
101 c[n][i][j]=c[x][i][j];
102 ansx++;
103 continue;
104 }
105 if(c[y][i][j]!='0'){
106 flag=1;
107 for(int k=1;k<=9;k++)
108 if(c[n][i][k]==c[y][i][j]){
109 flag=0;break;
110 }
111 for(int k=1;k<=9;k++)
112 if(c[n][k][j]==c[y][i][j]){
113 flag=0;break;
114 }
115 int wh=(i-1)/3*3+(j-1)/3+1;
116 for(int l=0;l<=2;l++)
117 for(int r=0;r<=2;r++)
118 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){
119 flag=0;break;
120 }
121 }
122 if(flag){
123 c[n][i][j]=c[y][i][j];
124 ansy++;
125 continue;
126 }
127 c[n][i][j]='0';
128 }
129 cout<<ansx<<" "<<ansy<<'\n';
130 ansx=0,ansy=0;
131 }
132 void print(int n){
133 for(int i=1;i<=9;i++)
134 for(int j=1;j<=9;j++)
135 c[n][i][j]=c[n-1][i][j];
136 for(int i=1;i<=9;i++){
137 cout<<"+-+-+-+-+-+-+-+-+-+"<<endl;
138 for(int j=1;j<=9;j++)
139 cout<<"|"<<c[n][i][j];
140 cout<<"|"<<endl;
141 }
142 cout<<"+-+-+-+-+-+-+-+-+-+\n";
143 }
144 int T,x,y,k;
145 signed main(){
146 for(int i=1;i<=19;i++){
147 cin>>s;
148 if(i&1)continue;//奇数
149 for(int j=1;j<=9;j++)
150 c[0][i/2][j]=s[j*2-1];
151 }
152 T=in;
153 for(int i=1;i<=T;i++){
154 cin>>s;
155 if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k);
156 else if(s[0]=='D')x=in,y=in,del(i,x,y);
157 else if(s[0]=='Q')x=in,y=in,query(i,x,y);
158 else if(s[0]=='M')x=in,y=in,merge(i,x,y);
159 else print(i);
160 }
161 return 0;
162 }
2021.11.2-测试T1数独的更多相关文章
- 2021.11.4测试T1-妹子
题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...
- 日常Javaweb 2021/11/19
Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...
- 日常Java 2021/11/18
用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...
- 2021.11.30 eleveni的水省选题的记录
2021.11.30 eleveni的水省选题的记录 因为eleveni比较菜,eleveni决定先刷图论,再刷数据结构,同时每天都要刷dp.当然,对于擅长的图论,eleveni决定从蓝题开始刷.当然 ...
- 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)
2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...
- 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)
2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...
- 2021.11.11 EXKMP
2021.11.11 EXKMP https://www.luogu.com.cn/problem/P5410 下标以1开头: #include<cstdio> #include<i ...
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- 2021.11.10 fail树
2021.11.10 fail树 https://blog.csdn.net/niiick/article/details/87947160 1. AC自动机与fail树的神奇关系 1.1 AC自动机 ...
随机推荐
- Java基础系列(31)- 可变参数
可变参数 JDK1.5开始,Java支持传递同类型的可变参数给一个方法 在方法声明中,在指定参数类型后加一个省略号(...) 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数.任何普通的参数 ...
- Java基础系列(6)- 注释
注释 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了 注释不会被执行,是给开发人员看的 书写注释是一个非常好的习惯 Java中的注释有 ...
- 集合转数组:toArray()最优化方法探索
优化背景 有些场景下(比如入参要求)需要将集合(比如List)转为数组类型,利用集合的toArray方法应该最为方便的,对于toArray()无参方法其返回的是Object[],强制转其他类型数组会C ...
- PHP 相对路径转换为绝对路径 realpath
* 相对路径 -> 绝对路径 realpath <?php /** * @param string $in_rel: relative directory * @param string ...
- LR进行内外网附件上传并发——实践心得
刚开始接触LR的时候,做了一次内外网附件上传的并发测试,比较简单,但当时理解有些欠缺.以下为当时的实践心得: 1.分内外网测试的意义: 内网测试主要看负载压力情况等,外网测试主要考虑网络带宽.网络延时 ...
- cgroup之cpu关键参数
cpu.cfs_period_us specifies a period of time in microseconds (µs, represented here as "us" ...
- 关于Postman你必须学会的技能
关于Postman 工欲善其事,必先利其器,在了解了接口测试之后,就要选择一款适用的工具.之所以选择postman是因为它简单.容易上手.能覆盖大多数HTTP接口测试场景,性价比极高. Postman ...
- 深入浅出WPF-06.Binding(绑定)01
Binding(绑定) 先上图,再解释 针对这个图,我们先来说说什么是Binding. Binding就是一个桥梁,建立在数据和UI之间的桥梁.既然是数据驱动,那么我们就把数据称之为"源&q ...
- excel模板数据填充 :tablefill
背景(问题) 在Web后台系统中或多或少都存在导入数据的功能,其中操作流程基本是 1.下载模板 2.填充模板数据 3.上传模板 但通常比较耗费时间的是填充模板数据这一步骤, 已自己为例之前的数据要么是 ...
- 使用python -m pip install 和 pip install 安装包有什么区别?
如果去看源码的话,你会发现 pip 作为执行文件的入口点是 pip._internal.main. 另一方面,pip 作为模块运行时入口是 _main.py,而该模块也只是调用 pip.interna ...