1.基于第一次的数独作业添加额外的GUI界面
a.生成任意数量的数独并能将数独在界面内依次显示,棋盘上总空格数大于30,小于60,每3*3小棋盘中挖空不少于2个。
b.数独题目只有唯一一解
c.用户可以在界面上通过编辑输入完成数独题目。
d.用户完成数独题目后可以得到正确性反馈
e.友好的使用说明。
2.其他要求与第一次作业相同
作业:应为自己对C++掌握不足,所以在此次作业中使用了其他的编程语言来实现。实验环境tomcat服务器、C++、html
应为在这次的作业中无法将所有的功能全部用C++语言来实现,所以界面使用Html来编写、用Ajax来读取txt文件里面的数据(因为存在跨域的问题就使用tomcat作为服务器)
C++的输出数组的txt文档命名方式也是用(0~n).txt来命名,方便ajax来取文档数据。
C++代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include<windows.h> int main() { int a[9][9] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0 }; int i,j,l; int n; int sudu(int i,int j,int a[9][9]); int find_next_empty(int a[9][9],int num, int *i, int *j); srand(time(0)); printf("输入数独个数 "); //生成不重复的函数 scanf("%d",&n); for(l=0;l<n;l++) { int a[9][9] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0 }; int time1=rand()%10; printf("请等待.... "); Sleep(time1*100); for(j=0;j<9;j++) { int flag=1; int random=time1+rand()%10; for(i=0;i<9;i++) { if(random == a[0][i]) { flag=0; } } if(flag==1) { a[0][j]=random; } } for(i=0;i<9;i++) { for(j=0;j<9;j++) { //printf("%d ",a[i][j]); } //printf(" "); } for(i=0;i<9;i++) { for(j=0;j<9;j++) { sudu(i,j,a); find_next_empty(a, 0, &i, &j); } } FILE *fpt; char s[100]; sprintf(s,"%d",l); sprintf(s,"%s%s",s,".txt"); fpt = fopen(s,"a+");//打开文档,写入 for(i=0;i<9;i++) { for(j=0;j<9;j++) { fprintf(fpt,"%d|",a[i][j]); printf("%d ",a[i][j]); } //fprintf(fpt," "); printf(" "); } //fprintf(fpt,"-------- "); printf("-------- "); fclose(fpt); } return 0; } int sudu(int row,int col,int arr[9][9]) { int count=0; int flag=1; int i,j; int next_row,next_col; int find_next_empty(int a[9][9], int num, int *i, int *j); //获取下一个元素的行和列 /*for(i=row;i<9;i++) { for(j=col;j<9;j++) { if(arr[i][j]==0) { nextRow=i; nextCol=j; break; } } }*/ tag: while(count<9) { count++; int i,j; //判断行重复 for (j = 0; j < 9; j++) { if (arr[row][j] == count) { goto tag; } } // 判断列重复 for (i = 0; i < 9; i++) { if (arr[i][col] == count) { goto tag; } } /* 判断3x3宫格重复*/ int x = (row / 3) * 3; int y = (col / 3) * 3; for (i = x; i < x + 3; i++) { for (j = y; j < y + 3; j++) { if (arr[i][j] == count) { goto tag; } } } arr[row][col]=count; if (!find_next_empty(arr, row, &next_row, &next_col)) { return 1; } //否则继续填下一个未填充的格子 if (!sudu(next_row, next_col,arr)) { arr[row][col] = 0; continue; } else { return 1; } return 0; } return 0; } // 寻找下一个未填充的单元 int find_next_empty(int arr[9][9], int startrow, int *row, int *col) { int i, j; for (i = startrow; i < 9; i++) for (j = 0; j < 9; j++) if (arr[i][j] == 0) { *row = i; *col = j; return 1; } return 0; }
Html代码
<!DOCTYPE html> <!-- 30<棋盘总空格数<60,3x3棋盘中最少挖空数>=3 ==>每个3X3棋盘都挖空4个 30<4*9<60 --> <html> <head> <meta charset="UTF-8" /> <link href="styles/style.css" type="text/css" rel="stylesheet"> <script type="text/javascript" src="script/jquery.min.js"></script> <script type="text/javascript" src="script/EdTable.js"></script> <script> $(document).ready(function(){ EdTable.initBindGridEvent(); }); var num=0; window.onload=function() { var xhr =new XMLHttpRequest() xhr.open("GET", num+".txt", true);//注意路径问题读取data.txt文件的内容。 xhr.send(null); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200||xhr.status==0) {//请求本地txt文件时状态码是0。 //alert(xhr.responseText); for(var i=0;i<81;i++) { var result = xhr.responseText.split("|"); } for(var j=0;j<81;j++) { //console.log(result[j]); } //创建完整表格 var row1=9;//获取属性值 var col1=9;//获取属性值 var div1=document.getElementById("div1"); var tab="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='wanzheng' style='float:right;display:none'>"; //循环行 var flag=0; for(var i=0;i<row1;i++) { tab+="<tr>"; //循环列 for(var j=0;j<col1;j++) { tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; flag=flag+1; } tab+="</tr>"; } tab+="</table>"; //缺失数组 tab+="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='queshi' style='float:left'>"; //循环行 var flag=0; for(var i=0;i<row1;i++) { tab+="<tr>"; //循环列 for(var j=0;j<col1;j++) { //写死 每个3X3棋盘都挖空4个 if(flag =='0' || flag == '1' || flag == '10' || flag == '19') { result[flag]=" "; } if(flag =='21' || flag == '13' || flag == '4' || flag == '5') { result[flag]=" "; } if(flag =='7' || flag == '8' || flag == '15' || flag == '25') { result[flag]=" "; } if(flag =='27' || flag == '37' || flag == '29' || flag == '38') { result[flag]=" "; } if(flag =='39' || flag == '40' || flag == '41' || flag == '48') { result[flag]=" "; } if(flag =='33' || flag == '42' || flag == '51' || flag == '43') { result[flag]=" "; } if(flag =='54' || flag == '64' || flag == '74' || flag == '72') { result[flag]=" "; } if(flag =='66' || flag == '67' || flag == '68' || flag == '75') { result[flag]=" "; } if(flag =='60' || flag == '61' || flag == '62' || flag == '69') { result[flag]=" "; } if(result[flag]==" ") { tab+="<td style='background-color:yellow'><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; } else { tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; } flag=flag+1; } tab+="</tr>"; } tab+="</table>"; div1.innerHTML=tab; } else { alert(xhr.status); } } } } function getTdValue() { var table = document.getElementById("queshi"); //获得整个表格对象 var table1=document.getElementById("wanzheng"); for (var i = 0; i < 9; i++) { //表格的第i行,第2列 for (var j = 0; j < 9; j++) { var value1=table.rows[i].cells[j].innerText; var value2=table1.rows[i].cells[j].innerText; if(value1 != value2) { table.rows[i].cells[j].style.backgroundColor="red"; } } } } function show() { document.getElementById("wanzheng").style.display=""; } function creatshudu() { num=num+1; var xhr =new XMLHttpRequest() xhr.open("GET", num+".txt", true);//注意路径问题读取data.txt文件的内容。 xhr.send(null); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200||xhr.status==0) {//请求本地txt文件时状态码是0。 //alert(xhr.responseText); for(var i=0;i<81;i++) { var result = xhr.responseText.split("|"); } for(var j=0;j<81;j++) { //console.log(result[j]); } //创建完整表格 var row1=9;//获取属性值 var col1=9;//获取属性值 var div1=document.getElementById("div1"); var tab="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='wanzheng' style='float:right;display:none'>"; //循环行 var flag=0; for(var i=0;i<row1;i++) { tab+="<tr>"; //循环列 for(var j=0;j<col1;j++) { tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; flag=flag+1; } tab+="</tr>"; } tab+="</table>"; //缺失数组 tab+="<table border='1' bordercolor='blue' width='400' height='100' class='editableTable' id='queshi' style='float:left'>"; //循环行 var flag=0; for(var i=0;i<row1;i++) { tab+="<tr>"; //循环列 for(var j=0;j<col1;j++) { //写死 每个3X3棋盘都挖空4个 if(flag =='0' || flag == '1' || flag == '10' || flag == '19') { result[flag]=" "; } if(flag =='21' || flag == '13' || flag == '4' || flag == '5') { result[flag]=" "; } if(flag =='7' || flag == '8' || flag == '15' || flag == '25') { result[flag]=" "; } if(flag =='27' || flag == '37' || flag == '29' || flag == '38') { result[flag]=" "; } if(flag =='39' || flag == '40' || flag == '41' || flag == '48') { result[flag]=" "; } if(flag =='33' || flag == '42' || flag == '51' || flag == '43') { result[flag]=" "; } if(flag =='54' || flag == '64' || flag == '74' || flag == '72') { result[flag]=" "; } if(flag =='66' || flag == '67' || flag == '68' || flag == '75') { result[flag]=" "; } if(flag =='60' || flag == '61' || flag == '62' || flag == '69') { result[flag]=" "; } if(result[flag]==" ") { tab+="<td style='background-color:yellow'><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; } else { tab+="<td><span contenteditable='true' class='studentname' id="+flag+">"+result[flag]+"</span></td>"; } flag=flag+1; } tab+="</tr>"; } tab+="</table>"; div1.innerHTML=tab; } else { alert(xhr.status); } } } } </script> <title>file upload</title> <style> .editableTable { width: 546px; height: 500px; 22: ; padding: 10px; background-color: #DDEEF6; border: 1px solid #DDEEF6; -webkit-border-radius: 6px; -moz-border-radius: 6px; } </style> </head> <body> <input type="button" id="table" value="结果分析" onclick="getTdValue()"> <input type="button" id="table" value="查看正确答案" onclick="show()"> <input type="button" id="table" value="下一个数独" onclick="creatshudu()"> <div id="div1"> <div id="div2"> </div> </body> </html>
GUI界面
心得:在本次作业中主要面对的有C++随机数,因为数组的产生需要随机两次,因为很难实现所以还是依旧随机一次。ajax读取txt文档时的数独数组之间的分离,第一次尝试将所有的数组都输出到一个文件里面,但是在ajax取得数据是发现很难拆分,因为当取得所有数据是需要切两下(1、多个数独数组分成单个的数独数组保存,之后单个的数独数组拆分,所以后面弄得有点混乱,代码量有点大,就干脆将C++输出的数独数组单个放在不同的txt文件中)