数独填充问题
来源:互联网 发布:浏览器 网络连接错误 编辑:程序博客网 时间:2024/05/22 20:42
题目描述
给出一个4*4的矩阵,在矩阵中填入数字1,2,3,4,使得每行、每列的数字不重复,而且左上角、右上角、左下角、右下角的2*2小矩阵的4个数字不重复。
输入描述
输入包含多组测试数据。第一行为一个整数T(1<=T<=10),表示有T组测试数据。
第二行开始为T组测试数据。
输出描述
首先输出一行“Case #x:”,x表示第i组测试数据。
然后输出填充的4*4矩阵。每组测试数据之间输出一个空行。
输入样例
2****234141233214*243*312*421*134
输出样例
Case #1:1432234141233214Case #2:1243431234212134
提示
AC代码如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>char mat[4][4]; ///存储4*4的数字矩阵int cnt;struct point{ int row, col;} p[17];int try(int pos){ if(pos > cnt) return 1; int row, col; row = p[pos].row; col = p[pos].col; int vis[5]; ///数字1-4是否已填写 memset(vis, 0, sizeof(vis)); int i; for(i=0; i<4; i++) ///检查(row,col)安全性 { if(mat[row][i] != '*') vis[mat[row][i]-'0'] = 1; if(mat[i][col] != '*') vis[mat[i][col]-'0'] = 1; } if(mat[row^1][col^1] != '*') vis[mat[row^1][col^1]-'0'] = 1; int x; for(x=1; x<=4; x++){ ///依次尝试1,2,3,4的数字 if(!vis[x]){ mat[row][col] = x + '0'; if(try(pos+1)) return 1; ///成功就返回,否则回溯 mat[row][col] = '*'; } } return 0;}int main(){ // freopen("mat4.in", "r", stdin); // freopen("mat4.out", "w", stdout); int t, k = 0; scanf("%d", &t); while(t--) { cnt = 0; ///读入4*4矩阵 int i, j; char ch[5]; ///读入一行字符 for(i=0; i<4; i++){ scanf("%s", ch);///读入一行字符存入数组ch[] for(j=0; j<4; j++){ mat[i][j] = ch[j]; if(mat[i][j] == '*'){ cnt++; p[cnt].row = i; p[cnt].col = j; /// cnt++; 放到这里,p[]从0开始就错了 } } } try(1); ///try(0); ///打印结果 printf("Case #%d:\n", ++k); for(i=0; i<4; i++){ for(j=0; j<4; j++) printf("%c", mat[i][j]); printf("\n"); } } return 0;}
阅读全文
0 0
- 数独填充问题
- 1003: 数独填充问题
- 数独问题思考
- 数独问题
- cs101,数独问题
- 数独问题
- 4.9 数独问题
- 数独问题
- hdu - 数独问题
- 数独问题
- 算法 数独问题
- 数独问题
- 数独问题
- 数独问题
- 数独问题
- skudo数独问题
- 数独问题
- 数独问题
- 关于自动生成艺术字体和获得字体文件初始Size
- 变位词快速分离
- 开启梦幻般的webrtc之旅(张高伟)
- 贪心法解决区间调度问题+快速排序
- HDU 3308 线段树
- 数独填充问题
- AOP的简单代码实现
- 使用ViewPager+Fragment实现底部导航栏
- 安卓大图显示不OOM方案,极简代码,实现拖动、缩放等功能
- 大型网络不得不考虑的几个问题?(张高伟)
- v5.51总结-开发人员怎么测试
- html中点击左边菜单右边内容切换
- 简单Makefile中指定链接脚本(地址)的代码
- UVa 11150 Cola