zoukankan      html  css  js  c++  java
  • 软件工程实践2019第三次作业

    GitHub地址:https://github.com/lllovehhh/031702232
    PSP表格

    |||||||||
    |:--|:--|:--|:--|
    |PSP2.1|Personal Software Process Stages|预估耗时(分钟)|实际耗时(分钟)
    |Planning|计划| 0.5h | 1h
    |Estimate|估计这个任务需要多少时间| 19.5h |28h
    |Development |开发 |3h|5h
    |Analysis| 需求分析(包括学习新技术) |3h |5h
    |Design Spec| 生成设计文档 |1h|3h
    |Design Review| 设计复审|0.5h |0.5h
    |Coding Standard|代码规范 (为目前的开发制定合适的规范) |0.5h|0.5h
    |Design|具体设计|1h |1h
    |Coding |具体编码|4h|5h
    |Code Review|代码复审|1h| 1h
    |Test| 测试(自我测试,修改代码,提交修改)|2h|3h
    |Reporting |报告 |0.5h|0.5h
    |Test Repor |测试报告 |0.5h|0.5h
    |Size Measurement |计算工作量|1.5h|1.5h
    |Postmortem & Process Improvement Plan |事后总结, 并提出过程改进计划|0.5h| 0.5h
    |合计||19.5h|28h|

    代码

    主函数,用的是深度搜索。4、6、8、9是有宫的,分四个不同的函数搜索。3、5、6是无宫的,可以放在一起。

    int main(int argc, char** argv)
    {
    
    	ifstream infile;
    	ofstream outfile;
    	if (argc == 1)
    	{
    		m = 3, n = 1;
    		outfile.open("g:\软工实践\output.txt");
    		infile.open("g:\软工实践\input.txt");
    	}
    	else
    	{
    		m = atoi(argv[2]);
    		n = atoi(argv[4]);
    		outfile.open("g:\软工实践\output.txt");
    		infile.open("g:\软工实践\input.txt");
    	}
    	while (n--)
    	{
    
    		for (int i = 1; i <= m; i++)
    			for (int j = 1; j <= m; j++)
    			{
    
    				char c;
    				infile >> c;
    				int t;
    				t = c - 48;
    				if (t != 0)
    				{
    					if (m == 3 || m == 5 || m == 7) p[i][t] = l[j][t] = fz[i][j] = true;
    					if (m == 4) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 2 + 1][t] = true;
    					if (m == 6) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 3 + 1][t] = true;
    					if (m == 8) p[i][t] = l[j][t] = fz[(i - 1) / 4 * 4 + (j - 1) / 2 + 1][t] = true;
    					if (m == 9) p[i][t] = l[j][t] = fz[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][t] = true;
    				}
    
    				sd[i][j] = t;
    			}
    		if (m == 3 || m == 5 || m == 7) dfsm(1, 1);
    		if (m == 4) dfs4(1, 1);
    		if (m == 6) dfs6(1, 1);
    		if (m == 8) dfs8(1, 1);
    		if (m == 9) dfs9(1, 1);
    		memset(p, 0, sizeof(p));
    		memset(l, 0, sizeof(l));
    		memset(fz, 0, sizeof(fz));
    	}
    
    //cout<<"k="<<k<<endl;outfile <<"k="<<k<<endl
    	for (int i = 1; i < k; i++)
    	{
    		cout << sudoku[i] << " "; outfile << sudoku[i] << " ";
    		if (i%m == 0)
    		{
    			cout << endl; outfile << endl;
    			//cout<<"i="<<i<<endl;outfile <<"i="<<i<<endl
    			if(i%(m*m)==0)
    			{
    				cout << endl; outfile << endl;
    			 } 
    		}
    
    	}
    	
    	return 0;
    }
    

    深度搜索函数,有宫的时候,比如九宫格,每增加三行,宫格序号加三,每增加三列,宫格序号加一。

    void dfsm(int x, int y)
    {
    	;
    	if (sd[x][y] != 0)//如果原来这个位置有数字,跳过。 
    		if (x == m && y == m) out();
    		else if (y == m)dfsm(x + 1, 1);
    		else dfsm(x, y + 1);
    	else//原来的地方没有数字,准备填充 
    		for (int i = 1; i <= m; i++)
    			if ((!p[x][i]) && (!l[y][i]))
    			{
    				sd[x][y] = i;
    				p[x][i] = l[y][i] = true;
    				if (x == m && y == m) out();
    				else if (y == m)dfsm(x + 1, 1);
    				else dfsm(x, y + 1);
    				sd[x][y] = 0;
    				p[x][i] = l[y][i] = false;
    			}
    }
    void dfs4(int x, int y)
    {
    	if (sd[x][y] != 0)
    		if (x == 4 && y == 4) out();
    		else if (y == 4)dfs4(x + 1, 1);
    		else dfs4(x, y + 1);
    	else
    		for (int i = 1; i <= 4; i++)
    			if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i]))
    			{
    				sd[x][y] = i;
    				p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true;
    				if (x == 4 && y == 4) out();
    				else if (y == 4)dfs4(x + 1, 1);
    				else dfs4(x, y + 1);
    				sd[x][y] = 0;
    				p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i] = false;
    			}
    }
    void dfs6(int x, int y)
    {
    	if (sd[x][y] != 0)
    		if (x == 6 && y == 6) out();
    		else if (y == 6)dfs6(x + 1, 1);
    		else dfs6(x, y + 1);
    	else
    		for (int i = 1; i <= 6; i++)
    			if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i]))
    			{
    				sd[x][y] = i;
    				p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = true;
    				if (x == 6 && y == 6) out();
    				else if (y == 6)dfs6(x + 1, 1);
    				else dfs6(x, y + 1);
    				sd[x][y] = 0;
    				p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = false;
    			}
    }
    void dfs8(int x, int y)
    {
    	if (sd[x][y] != 0)
    		if (x == 8 && y == 8) out();
    		else if (y == 8)dfs8(x + 1, 1);
    		else dfs8(x, y + 1);
    	else
    		for (int i = 1; i <= 8; i++)
    			if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i]))
    			{
    				sd[x][y] = i;
    				p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true;
    				if (x == 8 && y == 8) out();
    				else if (y == 8)dfs8(x + 1, 1);
    				else dfs8(x, y + 1);
    				sd[x][y] = 0;
    				p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = false;
    			}
    }
    void dfs9(int x, int y)
    {
    	if (sd[x][y] != 0)
    		if (x == 9 && y == 9) out();
    		else if (y == 9)dfs9(x + 1, 1);
    		else dfs9(x, y + 1);
    	else
    		for (int i = 1; i <= 9; i++)
    			if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i]))
    
    			{
    				sd[x][y] = i;
    				p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = true;
    				if (x == 9 && y == 9) out();
    				else if (y == 9)dfs9(x + 1, 1);
    				else dfs9(x, y + 1);
    				sd[x][y] = 0;
    				p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = false;
    			}
    }
    

    存数组,有n个数独,每个将其存到sudoku数组中

    void out()
    {
    
    	for (int i = 1; i <= m; i++)
    	{
    		for (int j = 1; j <= m; j++)
    		{
    			sudoku[k++] = sd[i][j];
    		}
    
    	}
    
    	//	memset(sd, 0, sizeof(sd));
    
    }
    

    一些头文件,注意#include<bits/stdc++.h>这个万能头文件vs里

    #include <bits/stdc++.h>
    #include<fstream> 
    using namespace std;
    int sd[11][11], m, sudoku[100000] = { 0 }, k = 1,n,t;//数独数组,n宫格 
    bool p[11][11], l[11][11], fz[11][11];//排,列,方阵。
    

    测试数据

    三宫格
    此处输入图片的描述
    四宫格
    此处输入图片的描述
    五宫格
    此处输入图片的描述
    六宫格
    此处输入图片的描述
    七宫格
    此处输入图片的描述
    八宫格
    此处输入图片的描述

    性能分析


    总结

    首先,数独需要用到深度搜索,这个知识点有点忘记,花了一定的时间去复习。然后文件的输入输出这一块我弄了好久,也问了好多大佬最后才修改成现在的样子,勉强能用吧。最后就是devc用多了,一下子改到vs有点不习惯,学会了一些基本操作和分析。

  • 相关阅读:
    Mysql中limit的用法详解
    EXCEPTION与ERROR的区别
    调用sed命令的三种方式
    学编程一定要上大学?美国一半码农都没有计算机学位
    awk 循环语句例子
    Ubuntu 16.04 LTS今日发布
    Ubuntu启动eclipse问题
    Vim技能修炼教程(6)
    Vim技能修炼教程(7)
    Vim技能修炼教程(5)
  • 原文地址:https://www.cnblogs.com/lllovehhh/p/11587903.html
Copyright © 2011-2022 走看看