数独挑战

数独挑战

https://ac.nowcoder.com/acm/problem/24911

巧妙的三招

1.读入数据的时候直接记录第cnt个需要填充的数组元素的x、y坐标 space结构体元素

2.用已经填充了多少个数字dep,作为dfs搜索深度.




struct ty {
	int x, y;
}space[90];
int mp[12][12];

//判断第i行,是否存在已经有数字j了
int h[12][12], l[12][12], gogn[12][12];
int cnt = 0;


//打表,用以判断坐标x,y的点是在第几个九宫格里面,

const int g[10][10] = { {0,0,0,0,0,0,0,0,0,0},
					 {0,1,1,1,2,2,2,3,3,3},
					 {0,1,1,1,2,2,2,3,3,3},
					 {0,1,1,1,2,2,2,3,3,3},
					 {0,4,4,4,5,5,5,6,6,6},
					 {0,4,4,4,5,5,5,6,6,6},
					 {0,4,4,4,5,5,5,6,6,6},
					 {0,7,7,7,8,8,8,9,9,9},
					 {0,7,7,7,8,8,8,9,9,9},
					 {0,7,7,7,8,8,8,9,9,9}, };
void print() {
	for ( int i = 1; i < 10; i++ ) {
		for ( int j = 1; j < 10; j++ ) {
			cout << mp[i][j];
			if ( j == 9 )cout << '\n';
			else cout << " ";
		}
	}
}
void dfs(int dep) {
	if ( dep > cnt )
	{
		print();
		return;
	}
	for ( int i = 1; i < 10; i++ )
	{
// 		if ( !h[space[dep].x][i] && !l[space[dep].y][i] && !gogn[g[space[dep].x][space[dep].y]][i])
// 		{
// 			h[space[dep].x][i] = 1;
// 			l[space[dep].y][i] = 1;
// 			gogn[g[space[dep].x][space[dep].y]][i] = 1;
// 			mp[space[dep].x][space[dep].y] = i;
// 			dfs(dep + 1);	
// 			h[space[dep].x][i] = 0;
// 			l[space[dep].y][i] = 0;
// 			gogn[g[space[dep].x][space[dep].y]][i] = 0;
// 		}
         int xx=space[dep].x,yy=space[dep].y;
         if(h[xx][i]==0&&l[yy][i]==0&&gogn[g[xx][yy]][i]==0){
                h[xx][i]=1;
                l[yy][i]=1;
                gogn[g[xx][yy]][i]=1;
                mp[xx][yy]=i;
                dfs(dep+1);
                h[xx][i]=0;
                l[yy][i]=0;
                gogn[g[xx][yy]][i]=0;
                mp[xx][yy]=0;
            }        
	}
}
int main(int arg, char** argv) {
// 	ios::sync_with_stdio(false);
// 	cin.tie(nullptr);
// 	cin.tie(nullptr);
	for ( int i = 1; i <10; i++ )
	{
		for ( int j = 1; j < 10; j++ )
		{
			cin >> mp[i][j];
			if ( mp[i][j] == 0 )
			{
				space[++cnt].x = i;
				space[cnt].y = j;
			}else{
                h[i][mp[i][j]]=1;
                l[j][mp[i][j]]=1;
                gogn[g[i][j]][mp[i][j]]=1; 
            }
		}
	}
	dfs(1);
	return 0;
}


全部评论

相关推荐

03-04 17:20
电力电子工程师
YOUXIANG:你的实习经历和你的项目对不上,搞电源的为什么不去电源厂实习。简历字有点多?单反激和PFC LLC两个项目,技术面可以问的东西都特别多,细节很多,磁性元件设计那些。
点赞 评论 收藏
分享
自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务