痛苦

题目

数 独

【问题描述】

给定一个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数独的更多相关文章

  1. 2021.11.4测试T1-妹子

    题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...

  2. 日常Javaweb 2021/11/19

    Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...

  3. 日常Java 2021/11/18

    用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...

  4. 2021.11.30 eleveni的水省选题的记录

    2021.11.30 eleveni的水省选题的记录 因为eleveni比较菜,eleveni决定先刷图论,再刷数据结构,同时每天都要刷dp.当然,对于擅长的图论,eleveni决定从蓝题开始刷.当然 ...

  5. 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

    2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...

  6. 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 ...

  7. 2021.11.11 EXKMP

    2021.11.11 EXKMP https://www.luogu.com.cn/problem/P5410 下标以1开头: #include<cstdio> #include<i ...

  8. 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)

    2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...

  9. 2021.11.10 fail树

    2021.11.10 fail树 https://blog.csdn.net/niiick/article/details/87947160 1. AC自动机与fail树的神奇关系 1.1 AC自动机 ...

随机推荐

  1. Dapr实战(三)状态管理

    状态管理解决了什么 分布式应用程序中的状态可能很有挑战性. 例如: 应用程序可能需要不同类型的数据存储. 访问和更新数据可能需要不同的一致性级别. 多个用户可以同时更新数据,这需要解决冲突. 服务必须 ...

  2. Nginx系列(2)- 正向代理和反向代理

    Nginx作用 Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理 正向代理是代理客户端,反向代理是代理服务端 正向代理要知道访问服务器的地址,反向代理不需要知道访问服务器的真实 ...

  3. Jmeter系列(30)- 性能指标(3) | 性能指标峰值

    性能指标峰值 简述 彻底理解了性能指标(1)(2)的内容,这一篇随笔其实就不用看了,而且大家也能猜到这一篇内容是啥:二八原则 性能指标不要硬性的往那些性能指标上去靠,要根据业务来,熟悉业务,明白了解你 ...

  4. AD学习笔记(基础)

    AD学习 1 学习思路 1.1 学什么 1.2 怎么学 2 AD本身 3 AD project 3.1 任务层级 3.2 PCB流程 4 原理图工作环境设置 5 开始 5.1工程创建 5.2 元件库介 ...

  5. 使用正则表达式在VS中批量移除 try-catch

    使用正则表达式在VS中批量移除 try-catch 前言 try-catch 意为捕获错误,一般在可能出错的地方使用(如调用外部函数或外部设备),以对错误进行正确的处理,并进行后续操作而不至于程序直接 ...

  6. linux 服务器资源 监控工具

    工具一:vmstat(服务端) 一.vmstat选项参数解释 -V:显示vmstat版本信息 -n:只在开始时显示一次各字段名称 -a:显示活跃和非活跃内存 -d:显示各个磁盘相关统计信息 -D:显示 ...

  7. python BeautifulSoup html解析

    * BeautifulSoup 的.find(), .findAll() 函数原型 findAll(tag, attributes, recursive, text, limit, keywords) ...

  8. GUI编程笔记

    GUI编程 告诉大家该怎么学? 这是什么? 它怎么玩? 该如何去我们平时运用? 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1.简介 GUi的核心技术:Sw ...

  9. PyCharm中文下载与安装教程【2021年更新】

    第一章:下载与安装 1.1   [版本介绍]多个版本的介绍与选择 Jetbrain 公司是一家专业的 IDE 生产商,只要是市面上主流的编程语言,Jetbrain 都有相应的产品. 比如:Python ...

  10. ThreadLocal底层

    1. 首先我们来看一下他的使用 public class ThreadLocalTest { public static void main(String[] args) { MyThread thr ...