A. 九宫格的做法
1. PS 制作法
推荐大家使用这种方法,因为做出来的图是真正的九张图,并且在微信朋友圈里完美拼接。
(1)在 Photoshop 中打开图片,选择“裁剪工具”,按住 shift 键,把图片截出一个正方形。
(2)在“裁剪工具”的位置右击,选择“切片工具”,然后右击图片,选择“划分切片”。把“水平划分为”和“垂直划分为”都勾选上,数字都填 3 ,点“确定”。
(3)接下来的一步非常关键,点击“文件”-“存储为 Web和设备所用格式”,按住 shift 键把九张切片全都选中,把右上方默认的 GIF 格式改为 JPEG 格式,点击“存储”即可。
(4)桌面上会多出一个命名为 images 的文件夹,打开文件夹,里面就是 9 张我们切好的图片,自动按照顺序编号。
注意:做好后,需要用网页版微信向手机微信传输这九张图片,一定要按照编号顺序一张一张耐心传,一次性传过去由于网络原因会导致顺序被打乱!之后把传到手机的图片每张都按顺序保存到手机,发朋友圈的时候也要注意按左上角到右下角的顺序上传图片。
2. PPT 制作法
这种方法做出来的实际上是一张图片,不涉及排序,把图传到手机上会比较方便,但微信朋友圈中一张图片会比九张图片总共的面积小,所以效果不如 PS 法的好。
(1)新建一个版式为“空白”的 PPT ,插入图片,同样选择裁剪工具,按住 shift 键,把图片截出一个正方形。
(2)插入一个 3*3 的表格,把“标题行”和“镶边行”的默认对勾去掉。选中所有单元格,将“底纹”改为“无填充颜色”,将“笔颜色”改为白色,笔划粗细改为 4.5 磅,然后在“边框”中选择“内部框线”。
(3)拉大表格,使表格和正方形图片完全重合。Ctrl+A 全选,右击边框右下角,在弹出菜单里选择“另存为图片”,选择 JPEG 格式保存即可。
B. 职场中PPT很常用,如何制作出好看的九宫格拼图
在别人的PPT演示中,常常会看到如下图所示的九宫格拼图:看起来简约大方又让人眼前一亮,让枯燥的PPT演讲顿时添了几分诗意。
方法二、合并形状的拆分
在Office 2013 及以上版本中,支持图片与形状之间进行“合并形状”操作。
1、在图片上的横向、纵向分别绘制四个大小一致的长条矩形;
2、使用“对齐工具”里的“横向分布”、“纵向分布”将长条矩形均匀分布;
3、先选中图片,再全选(快捷键 Ctrl+A )所有矩形;
4、选择“合并形状”里的“拆分”将图片拆分成九个独立的小图片。
怎么样,现在学会如何在PPT中制作出九宫格拼图了吗?方法多多,快点用起来吧!
C. “九宫阵”智力游戏。用C++编程
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
程序如下:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int a[9][9];
int i,j,k,l;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
for (l = 0; l < 3; l++)
{
int x = k*3 + l;
x = (x%3) + ((x/3 + j)%3)*3;
x = x/3*3 + ((x + i)%3);
a[i*3 + k][j*3 + l] = x + 1;
}
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
getchar();
return 0;
}
//---------------------------------------------------------------------------
D. web前端开发要学些什么东西,以及学习顺序,求大佬解答,谢谢了。
前端行业的薪资居高不下,对于想入门的小白却不知道如何学起,今天爱前端考拉老师告诉你小白如何开启前端学习以及需要掌握哪些知识点。
学习对象:0基础,对互联网充满热情,想要从事H5前端开发、全栈开发的学员;
第一阶段 互联网基本原理和HTML
互联网基本原理、服务器、浏览器、HTTP请求的概念。编程工具介绍、HTML简介。HTML语义化标签、p标签和h系列标签。HTML基本骨架深入、HTML骨架、HTML和XHTML的区别。元信息标记meta、设置页面关键字、字符集、关键字、页面描述。a标签和img标签,相对路径、绝对路径。ul、ol、dl标签、div和span标签、较不常用HTML标签简介。表单、提交表单action、传送方法method、插入表单对象。HTML注释、HTML字符实体。
第二阶段CSS基础和高级技巧
选择器。文字属性、颜色属性。继承性和层叠性,权重计算。CSS盒模型,width、height、padding、border、margin属性。父子嵌套模型,使用Fireworks精确还原设计图。float浮动属性、浮动的意义、清除浮动的方法。浏览器兼容,CSS hack。 background系列属性、css精灵、网页上透明。超级链接的伪类、导航条。 position定位、定位小技巧。DIV+CSS布局。
第三阶段 静态网站制作项目
通过以上两个阶段的学习可以达到制作网页的水平,学习要求。需要掌握搜索引擎优化的概念、页面常用SEO技巧、学会有格调的制作页面。iconfont字体图标。一些常见的CSS高级技巧,比如负margin、压线技术、滑动门、列自撑技术。较复杂布局网站的学习,学习制作2~3个页面。通栏banner、大背景等时下流行的网站制作方法。精美企业站赏析、制作
第四阶段JavaScript基础
语句、执行顺序、词法结构、标识符、关键字、变量、常量、alert语句和console控制台。值和变量、数字、文本、布尔值、null和undefined。表达式和运算符、运算符概述。流程控制、赋值语句、条件判断语句、if语句、if语句的嵌套、switch语句、循环控制语句、while语句、do…while语句、for循环。跳转语句:continue语句、break语句。函数、参数、返回值、递归、作用域、全局变量、局部变量。内部对象、数组、字符串。
第五阶段JavaScript DOM编程
事件与事件处理概述、事件与事件名称、常用事件、事件处理程序的调用、DOM事件模型、事件流、 事件对象、注册与移除事件。文档对象的常用属性、方法与事件、输出数据。事件的三要素。DOM对象、DOM概述、DOM分层、DOM级别、DOM对象节点属性、遍历文档树、克隆删除替换。动画基础知识、定时器、setInterval和setTimeout、运动效果、 实用的动画、制作运动效果案例
第六阶段jQuery页面特效
jQuery对象和DOM对象、jQ选择器、CSS操作、设置和获取HTML、文本和值。事件、加载DOM、事件绑定、合成事件、事件对象的属性。动画、自定义动画方法、动画回调函数、停止动画、其他动画方法。jQuery对表单、表格的操作及更多应用、表单应用、表格应用。jQuery插件,jQueryUI,jQuery ease,jQuery mousewheel等。超多页面特效!结合案例掌握了解jQuery插件的使用。
第七阶段JavaScript进阶
命名空间、对象扩展、数组化、主流框架引入的机制——domReady、无冲突处理。语言模块、字符串的扩展与修复、数组的扩展与修复、数值的扩展与修复、函数的扩展与修复、 日期的扩展与修复、浏览器嗅探与特征侦测 、判定浏览器、事件的支持侦测、样式的支持侦测。类工厂、JavaScript对类的支撑、各种类工厂的实现。浏览器内置的寻找元素的方法、属性模块、如何区分固有属性与自定义属性。
第八阶段HTML5和CSS3
HTML5概述、HTML5新特性、HTML5组织、HTML5构成、HTML5页面的特征、HTML基础、HTML5全局属性、HTML5其他功能、HTML5元素分类。实战HTML5表单、新增的input输入类型。HTML5音频与视频、HTML5多媒体技术概述、在HTML5中播放音频。CSS3编码规范、了解CSS3新增特性。CSS选择器、属性选择器、结构伪类选择器、UI伪类选择器。旋转动画、缩放动画、移动动画、倾斜动画。3D炫酷动画效果实战。
第九阶段移动web和响应式网页
视口、缩放 、分辨率、物理分辨率、设备像素比、dppx和dpi 、meta视口。百分比布局、流式布局、CSS3新的流式盒模型。触摸和指针事件、触摸事件、手势事件 、其他事件、拖放、滚动层、事件和交互模式、移动端交互综合实战。zepto.js、jQuery Mobile等移动端常见框架。HTML5速成移动端框架。Bootstrap3 、调整响应式导航条断点。移动优先、Bootstrap栅格系统、栅格系统原理、Bootstrap中的JavaScript交互、Bootstrap敏捷开发。
第十阶段服务器知识和PHP入门
后台语言和前台语言的区别。初识PHP、PHP语言的优势、PHP 5的新特性、PHP的发展趋势、PHP的应用领域。 PHP环境搭建和开发工具。PHP语言基础、PHP变量、PHP运算符、 PHP的表达式、PHP编码规范、流程控制语句、字符串操作、PHP数组、 PHP与Web页面交互。数据库技术概述、增删改查。
第十一阶段Ajax企业项目实战开发
Ajax概述与Ajax初体验、Ajax技术介绍、XMLHttpRequest对象详解、动态加载和显示数据、XMLHttpRequest对象概述、方法、属性、发送请求、GET和POST请求、运行周期、使用JSON响应、Ajax实用包的封装。JSON的解析、Underscore模板引擎、模板技术、动态组装页面、电话号码归属地查询、验证码等。Ajax实战篇 、Ajax高级表单验证程序 、Ajax动态联动菜单、瀑布流。
第十二阶段JavaScript面向对象
创建对象、属性的查询和设置、 删除属性、检测属性、枚举属性、属性getter和setter、属性的特性、对象的三个属性、序列化对象、对象方法。类和模块、类和原型、类和构造函数、类的扩充、类和类型、子类。原型、实例化和原型、 对象实例化、通过构造器判断对象、继承与原型链、构造函数和原型对象 、构造函数、原型对象 、[[Prototype]]属性 、在构造函数中使用原型对象 、改变原型对象、内建对象的原型对象。
第十三阶段canvas动画和手机游戏
Canvas绘图、基本知识、理解canvas坐标系、获取canvas环境上下文、理解路径、路径操作API 、绘制线条 、绘制矩形 、绘制圆弧 、绘制贝塞尔曲线 、线条属性 、线条颜色 、填充 、绘图状态。图像API、使用canvas绘制图像、坐标变换、绘制文字。游戏原理、制作2D游戏引擎、理解游戏循环、渲染引擎实现、使用引擎构建游戏实例、游戏常用算法。
第十四阶段Node.js企业项目开发
Node的特点、异步I/O、事件与回调函数、单线程、跨平台、Node的应用场景、I/O密集型、CommonJS规范、Node的模块实现、路径分析和文件定位、模块编译、核心模块、JavaScript核心模块的编译过程、网络编程、构建TCP服务。构建HTTP服务、构建WebSocket服务、网络服务与安全。MongoDB、Express、Mongoose、socket.io。小型微博系统、俄罗斯方块对战。Linux使用。
第十五阶段信小程序
小程序概述、 小程序开发账户的注册、获得AppId下载使用开发者工具、认识默认的文件夹结构、appjson配置、双大括号差值和MVVM模式、小程序操作数字、小程序API起步、案例调色板、案例微博发布框、for循环指令、if判断指令和复选按钮组、阿里云服务器开通、请求服务数字和发出改变数字、get请求信息流案例、post请求和图片上传、数据库mogodb、班级说说
第十六阶段ECMAScript2016
简介、let和const命令、变量的解构赋值、字符串的扩展、正则的扩展、数值的扩展、数组的扩展、函数的扩展、对象的扩展、Symbol、Set和Map数据结构、Proxy、Reflect、Iterator和for...of循环、Generator函数、Promise对象、异步操作和Async函数、Class、Decorator、Mole、编程风格、读懂规格、二进制数组、SIMD
第十七阶段Yeoman脚手架
基本安装、配置、HTML模板、图片压缩、构建工具、包管理器、JSLint测试。
第十八阶段Grunt和Gulp构建工具
GIT、SVN、Grunt、Gulp、Webpack。通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作。通过最少的 API,掌握 Gulp 毫不费力,构建工作尽在掌握:如同一系列流管道。
第十九阶段Sass、Less和Stylus
sass中可以定义变量,方便统一修改和维护。用sass进行 选择器的嵌套,表示层级关系。用sass中导入其他sass文件,最后编译为一个css文件t。用sass中可用mixin定义一些代码片段,且可传参数,方便日后根据需求调用
第二十阶段React.js构建视图组件
React简介、JSX、组件的生命周期、实例化、数据流、事件处理、组件的复合、mixin、DOM操作、动画、性能优化、服务端渲染、周边类库。VUE数据模板、生命周期、过滤器。
第二十一阶段VUE界面的前端库
遇见Vue.js、数据绑定、指令、计算属性、表单控件绑定、过滤器、Class与Style绑定、过渡、绑定事件、组件、表单校验、分组校验、与服务端通信、RESTful调用。
第二十二阶段React Native移动框架
React Native简介、React Native开发基础、常用组件介绍及实践、TextInput组件、九宫格实现、NavigatorIOS组件、Touchable类组件、状态机思维与状态机变量、深入理解UI重新渲染的过程、Navigator组件工作机制、混合开发基础、组件生命周期、数据存储及React Native应用实现步骤。
第二十三阶段 Cordova和PhoneGap
使用加速计和位置传感器、文件系统、存储及本地数据库、处理音频、图像和视频、处理通讯录、本地事件、使用XUI、使用jQuery Mobile进行用户界面开发、PhoneGap插件扩展、开发工具及测试。
第二十四阶段ionic framework
Ionic和Hybrid应用介绍、配置开发环境 、Ionic导航和核心组件、选项卡、高级列表和表单组件、开发高级应用、使用 Ionic 命令行代理、在页面中使用 ionScroll、过滤器:转换视图中的数据。
第二十六阶版本管理系统和项目打包测试
第二十七阶段前端攻防、部署和SEO
第二十八阶段WebGL和Three.js
第二十九阶段TypeScript和Angula4
E. 前端JavaScript用webstorm怎么在网页上生成一个九宫格图片
html代码:
<ul class="nineUL" id="nineUL"></ul>
CSS代码:
.nineUL{display:block; overflow:hidden; width:340px; margin:20px 0 0 50px;}
.nineUL li{display:block; width:100px; height:100px; overflow:hidden; float:left; margin-right:20px;}
.nineUL li img{vertical-align:middle; width:100%;}
JS代码:
window.onload = function(){
for(var i=0; i<9; i++){
var html = "<li><img src='picture/icon/8.jpg' /></li>";
var u = document.getElementById("nineUL");
var li = document.createElement("li");
li.innerHTML = "<img src='picture/icon/8.jpg' />";
u.appendChild(li);
if(i>0 && (i%3 == 2)){
li.style.margin="0px 0px 10px 0px";
}
}
}
效果图:
F. 81格的九宫格,用c语言编程,求助
#include"stdio.h"
//定义栈的最大长度
#defineMAXSTACKLENGTH81
//待求解的九宫格矩阵,空白位置用0表示
intjiuGongArray[][9]={{0,0,0,0,4,0,0,3,2},
{4,0,0,0,0,1,0,0,0},
{5,3,0,6,0,0,0,0,7},
{3,0,0,5,1,0,7,0,0},
{0,0,5,0,3,0,2,0,0},
{0,0,9,0,7,4,0,0,3},
{1,0,0,0,0,9,0,4,6},
{0,0,0,1,0,0,0,0,9},
{8,9,0,0,6,0,0,0,0}};
//空缺数据组成的矩阵,共有九个九宫格单元,从左到右,然后从上到下编号为0-8;
//例如:第一个九宫格单元空缺的数字为1,4,8,则矩阵dataNeedToBeInsert的第一行
//为{1,0,0,4,0,0,0,8,0}
intdataNeedToBeInsert[][9]={{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9}};
//定义栈单元的结构
typedefstruct
{
intxPosition;
intyPosition;
intjiuGongGePosition;
intnum;
}node;
//定义栈数组
nodestack[MAXSTACKLENGTH];
//由给定的九宫格矩阵,查找空缺的数据
voidFindDataToBeInsert(void)
{
inti,j;
intx,y;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(jiuGongArray[i][j]!=0)
{
x=(i/3)*3+j/3;
y=jiuGongArray[i][j]-1;
dataNeedToBeInsert[x][y]=0;
}
}
}
//输出m*n的矩阵
voidPrintArray(int*ptr,intm,intn)
{
inti,j;
intdata;
inttemp;
temp=n-1;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
data=*(ptr+i*n+j);
printf("%d",data);
if(j==temp)
{
printf(" ");
}
}
}
//核实是否满足结束条件
intCheckEnd(void)
{
inti,j,sum;
for(i=0;i<9;i++)
{
sum=0;
for(j=0;j<9;j++)
{
sum+=jiuGongArray[i][j];
}
if(sum!=45)
{
return-1;
}
}
for(j=0;j<9;j++)
{
sum=0;
for(i=0;i<9;i++)
{
sum+=jiuGongArray[i][j];
}
if(sum!=45)
{
return-1;
}
}
return0;
}
//从矩阵dataNeedToBeInsert[][]中查找下一个数据
intFindNextData(intm,intn,int*xPosition,int*yPosition)
{
intstate=0;
if(n>8)
{
n=0;
m++;
}
if(m>8)
{
state=CheckEnd();
if(state!=0)
return-1;
else
return1;
}
while(dataNeedToBeInsert[m][n]==0)
{
if(n<8)
n++;
else
{
n=0;
m++;
if(m>8)
{
state=CheckEnd();
if(state!=0)
return-1;
else
return1;
}
}
}
*xPosition=m;
*yPosition=n;
return0;
}
//核实元素对应的行和列是否有相同的数字
intCheckLine(intm,intn,intnum)
{
inti;
for(i=0;i<9;i++)
{
if(jiuGongArray[m][i]==num)
return-1;
}
for(i=0;i<9;i++)
{
if(jiuGongArray[i][n]==num)
return-1;
}
return0;
}
//核实是否满足入栈条件
intCheckCanPush(intm,intn,int*position)
{
intstart=*position;
inti,temp1,temp2,temp3,temp4;
intnum;
temp1=(m/3)*3;
temp2=(m%3)*3;
num=dataNeedToBeInsert[m][n];
for(i=start;i<10;i++)
{
temp3=temp1+(start-1)/3;
temp4=temp2+(start-1)%3;
if(jiuGongArray[temp3][temp4]!=0)
{
start++;
continue;
}
if(CheckLine(temp3,temp4,num)!=0)
{
start++;
continue;
}
else
{
*position=start;
return0;
}
}
return-1;
}
//入栈
intPush(int*top,intxPosition,intyPosition,intjiuGongGePosition,intnum)
{
if(*top>=MAXSTACKLENGTH)
{
printf("Reachstacktop! ");
return-1;
}
else
{
(*top)++;
stack[*top].xPosition=xPosition;
stack[*top].yPosition=yPosition;
stack[*top].jiuGongGePosition=jiuGongGePosition;
stack[*top].num=num;
return0;
}
}
//出栈
intPop(int*top,int*xPosition,int*yPosition,int*jiuGongGePosition,int*num)
{
if(*top==-1)
{
printf("Reachstackbottom! ");
return-1;
}
else
{
*xPosition=stack[*top].xPosition;
*yPosition=stack[*top].yPosition;
*jiuGongGePosition=stack[*top].jiuGongGePosition;
*num=stack[*top].num;
(*top)--;
return0;
}
}
voidmain()
{
intend=0;
intline=0;
introw=0;
inttop=-1;
intpositionInUnitArray=1;
intstate=0;
intnum;
FindDataToBeInsert();
PrintArray(jiuGongArray,9,9);
while(end!=1)
{
state=FindNextData(line,row,&line,&row);
if(state==0)
{
state=CheckCanPush(line,row,&positionInUnitArray);
if(state==0)
{
state=Push(&top,line,row,positionInUnitArray,dataNeedToBeInsert[line][row]);
if(state==0)
{
jiuGongArray[(line/3)*3+(positionInUnitArray-1)/3][(line%3)*3+(positionInUnitArray-1)%3]=dataNeedToBeInsert[line][row];
row++;
positionInUnitArray=1;
}
else
end=1;
}
else
{
state=Pop(&top,&line,&row,&positionInUnitArray,&num);
if(state==0)
{
jiuGongArray[(line/3)*3+(positionInUnitArray-1)/3][(line%3)*3+(positionInUnitArray-1)%3]=0;
positionInUnitArray++;
}
else
end=1;
}
}
elseif(state==1)
{
printf(" ");
PrintArray(jiuGongArray,9,9);
end=1;
}
else
{
printf("Someerroroccur! ");
end=1;
}
}
}
G. java编程九宫格问题
要求:根据输入的数字n,如:3,5,7...以矩阵显示n行n列数,这些数由1~n*n构成,要求矩阵的每行每列及对角线上n个数之和相等 预备知识: 在距阵中,1在第一行正中,随后的数字应放到上一个数字的右上方方格中,如果向上不行,就放到该列的最下方格子;如果向右不行,就放到该行的最左边;如果都不行,就放到上一个数字的正下方;如果目标格子中已经有数字,也放到上一个数字的正下方 思路: 1) 使用2维数组预备存储1~n*n这些数字 2) 1是放到第一行正中的,所以其索引号是:[0][(n-1)/2] 3) 随后的数字,其索引号原则如下 1> num的行索引为 num-1 的 (行索引-1) , num的列索引为 num-1 的 (列索引+1) 2>如果发现num的行,列索引都越位(-1或n),则 num的行索引为 num-1 的 (行索引+1) , num的列索引为 num-1 的 (列索引) 3>如果发现num的行,列索引指向的位置已经有数字,则 num的行索引为 num-1 的 (行索引+1) , num的列索引为 num-1 的 (列索引) 4>如果发现num的行越位(-1),则 num的行索引为n-1 5>如果发现num的列越位(n),则 num的列索引为0 import java.util.Scanner; public class JiuGong { public static void main(String[] args) { Scanner s = new Scanner(System.in); int x = s.nextInt(); //输入长度 int h = 0; //行 //在距阵中,1在第一行正中 int l = x / 2; //列 int[][] a = new int[x][x]; for (int i = 1; i <= x * x; i++) { a[h][l] = i; //运行提示溢出 //随后的数字应放到上一个数字的右上方方格中 h--; l++; //3.如果都不行,就放到上一个数字的正下方 if (h < 0 && l >= x) { //先返回上一个数字 h++; l--; //再下移一行 h++; } //1.如果向上不行,就放到该列的最下方格子 else if (h < 0) { h = x - 1; } //2.如果向右不行,就放到该行的最左边 else if (l >= x) { l = 0; } //4.如果目标格子中已经有数字,也放到上一个数字的正下方 else if (a[h][l] > 0) { //先返回上一个数字 h++; l--; //再下移一行 h++; } } //打印九宫格 for (int j = 0; j < x; j++) { for (int k = 0; k < x; k++) { System.out.print(a[j][k] + " "); } //换行 System.out.println(); } } }
采纳哦
H. C语言编程输出九宫格
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main()
{
#define n 3
int a[n][n]={0},i,sum=0,j;
i=0;j=n/2;
a[0][j]=++sum;
while(sum<n*n+1)
{i--;j++;
if(i<0&&j>=n)
{i=i+2;j--;}
else
{if(i<0)
i=n-1;
if(j>=n)
j=0;
}
if(a[i][j]==0)
a[i][j]=++sum;
else
{
i=i+2;
j--;
a[i][j]=++sum;
continue;}
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");}
getch();
}
I. VC怎么编九宫格编程
#include "stdio.h"
//定义栈的最大长度
#define MAXSTACKLENGTH 81
//待求解的九宫格矩阵,空白位置用0表示
int jiuGongArray[][9]={{0,0,0,0,4,0,0,3,2},
{4,0,0,0,0,1,0,0,0},
{5,3,0,6,0,0,0,0,7},
{3,0,0,5,1,0,7,0,0},
{0,0,5,0,3,0,2,0,0},
{0,0,9,0,7,4,0,0,3},
{1,0,0,0,0,9,0,4,6},
{0,0,0,1,0,0,0,0,9},
{8,9,0,0,6,0,0,0,0}};
//空缺数据组成的矩阵,共有九个九宫格单元,从左到右,然后从上到下编号为0-8;
//例如:第一个九宫格单元空缺的数字为1,4,8,则矩阵dataNeedToBeInsert的第一行
//为{1,0,0,4,0,0,0,8,0}
int dataNeedToBeInsert[][9]={{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9},
{1,2,3,4,5,6,7,8,9}};
//定义栈单元的结构
typedef struct
{
int xPosition;
int yPosition;
int jiuGongGePosition;
int num;
}node;
//定义栈数组
node stack[MAXSTACKLENGTH];
//由给定的九宫格矩阵,查找空缺的数据
void FindDataToBeInsert(void)
{
int i,j;
int x,y;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(jiuGongArray[i][j]!=0)
{
x=(i/3)*3+j/3;
y=jiuGongArray[i][j]-1;
dataNeedToBeInsert[x][y]=0;
}
}
}
//输出m*n的矩阵
void PrintArray(int *ptr,int m,int n)
{
int i,j;
int data;
int temp;
temp = n-1;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
data = *(ptr+i*n+j);
printf("%d ",data);
if(j == temp)
{
printf("\n");
}
}
}
//核实是否满足结束条件
int CheckEnd(void)
{
int i,j,sum;
for(i=0;i<9;i++)
{
sum = 0;
for(j=0;j<9;j++)
{
sum += jiuGongArray[i][j];
}
if(sum != 45)
{
return -1;
}
}
for(j=0;j<9;j++)
{
sum = 0;
for(i=0;i<9;i++)
{
sum += jiuGongArray[i][j];
}
if(sum != 45)
{
return -1;
}
}
return 0;
}
//从矩阵dataNeedToBeInsert[][]中查找下一个数据
int FindNextData(int m,int n,int *xPosition,int *yPosition)
{
int state=0;
if(n>8)
{
n = 0;
m++;
}
if(m>8)
{
state = CheckEnd();
if(state != 0)
return -1;
else
return 1;
}
while(dataNeedToBeInsert[m][n] == 0)
{
if(n<8)
n++;
else
{
n = 0;
m++;
if(m>8)
{
state = CheckEnd();
if(state != 0)
return -1;
else
return 1;
}
}
}
*xPosition = m;
*yPosition = n;
return 0;
}
//核实元素对应的行和列是否有相同的数字
int CheckLine(int m,int n,int num)
{
int i;
for(i=0;i<9;i++)
{
if(jiuGongArray[m][i] == num)
return -1;
}
for(i=0;i<9;i++)
{
if(jiuGongArray[i][n] == num)
return -1;
}
return 0;
}
//核实是否满足入栈条件
int CheckCanPush(int m,int n,int *position)
{
int start=*position;
int i,temp1,temp2,temp3,temp4;
int num;
temp1=(m/3)*3;
temp2=(m%3)*3;
num = dataNeedToBeInsert[m][n];
for(i=start;i<10;i++)
{
temp3 = temp1+(start-1)/3;
temp4 = temp2+(start-1)%3;
if(jiuGongArray[temp3][temp4]!=0)
{
start++;
continue;
}
if(CheckLine(temp3,temp4,num)!=0)
{
start++;
continue;
}
else
{
*position = start;
return 0;
}
}
return -1;
}
//入栈
int Push(int *top,int xPosition,int yPosition,int jiuGongGePosition,int num)
{
if(*top >= MAXSTACKLENGTH)
{
printf("Reach stack top!\n");
return -1;
}
else
{
(*top)++;
stack[*top].xPosition = xPosition;
stack[*top].yPosition = yPosition;
stack[*top].jiuGongGePosition = jiuGongGePosition;
stack[*top].num = num;
return 0;
}
}
//出栈
int Pop(int *top,int *xPosition,int *yPosition,int *jiuGongGePosition,int *num)
{
if(*top == -1)
{
printf("Reach stack bottom!\n");
return -1;
}
else
{
*xPosition = stack[*top].xPosition;
*yPosition = stack[*top].yPosition;
*jiuGongGePosition = stack[*top].jiuGongGePosition;
*num = stack[*top].num;
(*top)--;
return 0;
}
}
void main()
{
int end=0;
int line=0;
int row=0;
int top=-1;
int positionInUnitArray=1;
int state=0;
int num;
FindDataToBeInsert();
PrintArray(jiuGongArray,9,9);
while(end!=1)
{
state = FindNextData(line,row,&line,&row);
if(state == 0)
{
state = CheckCanPush(line,row,&positionInUnitArray);
if(state == 0)
{
state = Push(&top,line,row,positionInUnitArray,dataNeedToBeInsert[line][row]);
if(state ==0)
{
jiuGongArray[(line/3)*3+(positionInUnitArray-1)/3][(line%3)*3+(positionInUnitArray-1)%3]=dataNeedToBeInsert[line][row];
row++;
positionInUnitArray = 1;
}
else
end = 1;
}
else
{
state = Pop(&top,&line,&row,&positionInUnitArray,&num);
if(state == 0)
{
jiuGongArray[(line/3)*3+(positionInUnitArray-1)/3][(line%3)*3+(positionInUnitArray-1)%3] = 0;
positionInUnitArray++;
}
else
end = 1;
}
}
else if(state == 1)
{
printf("\n");
PrintArray(jiuGongArray,9,9);
end = 1;
}
else
{
printf("Some error occur!\n");
end = 1;
}
}
}