8月4日总结
来源:互联网 发布:淘宝欧舒丹是正品吗 编辑:程序博客网 时间:2024/05/21 11:25
从今天早上开始做数独的题,一直做到下午五点,刚开始看到这个题的时候感觉没有地方下手,一点头绪也没有,因为每行每列每个宫格都不可以有重复的数组,而且必须有1-9这九个数,刚开始一看题就感觉这个题的要求太多了。
数独问题:
题目大意:9*9的方格使得每行中每列和每个标记的3x3子方格中不能有重复的数字并且有1-9的每个数。
代码:#include <iostream>
#include <cstring>
using namespace std;
char M[9][9];
int m[9][9],vx[10][10],vy[10][10],vg[10][10];
int i,j,n,flag;
void dfs(int x,int y);
int main()
{
cin>>n;
while(n--)
{
for(i=0;i<9;i++)
cin>>M[i];
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
memset(vg,0,sizeof(vg));
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
m[i][j]=M[i][j]-'0';
if(m[i][j])
{
vx[i][m[i][j]]=1;
vy[j][m[i][j]]=1;
int k = 3*(i/3)+j/3;
vg[k][m[i][j]]=1;
}
}
flag=0;
dfs(0,0);
}
return 0;
}
void dfs(int x,int y)
{
if(x==9)
{
flag=1;
for(int i=0;i<9;i++)
{
for(j=0;j<9;j++)
cout<<m[i][j];
cout<<endl;
}
return ;
}
if(flag) return ;
if(m[x][y])
{
if(y==8)
dfs(x+1,0);
else
dfs(x,y+1);
}
else
{
for(int i=1;i<=9;i++)
{
int k = 3*(x/3)+y/3;
if(vx[x][i]==0&&vy[y][i]==0&&vg[k][i]==0)
{
m[x][y]=i;
vx[x][i]=1;
vy[y][i]=1;
vg[k][i]=1;
if(y==8)
dfs(x+1,0);
else
dfs(x,y+1);
m[x][y]=0;
vx[x][i]=0;
vy[y][i]=0;
vg[k][i]=0;
}
}
}
}
解题思路:建立三个数组用来标记某行某列某宫格已经用过的数,先定义一个字符数组,把地图输进去之后用二重循环减去‘0’转换成int型数组,转换之后判断是否为0,若不为0则将这个数标记下来,然后进行搜索,利用循环找数,当这个数在行列宫格都没用过的时候符合要求,把这个数进行循环,当把9*9的格子全部遍历一遍后搜索结束。
- 8月4日总结
- 今日总结 4月8日
- 2015年8月4日总结
- 8月8日总结
- 8月5日总结
- 8月10日总结
- 8月11日总结
- 8月7日总结
- 8月13日总结
- 8月1日总结
- 8月2日总结
- 8月3日总结
- 8月5日总结
- 8月7日总结
- 8月9日总结
- 8月10日总结
- 8月11日总结
- 8月12日总结
- 剑指offer面试题3 二维数组的查找(java实现)
- git命令
- 2017.8.4暑假集训第五天
- 线段树练习2
- 腾讯秋招上机题目游戏任务标记C++实现
- 8月4日总结
- 求区间中1的个数最多的数 若有多个输出最小的
- 临界判断&来回不间断切换效果的小算法
- Vue不同场景下组件间的数据交流
- 数据结构小结——顺序表(指针版)
- 线段树区间修改+区间查询
- java日期,时间比较
- 数据交换
- SPOJ VLATTICE