zoukankan      html  css  js  c++  java
  • poj2676解题报告

    题意:有一个9*9的格子 分成了9个3*3的小子格,一些位置上的已有一些数字。。现在要求你把没有数字的位置填上数,要求这个数没有出现在这个位置所在的行、列以及所在的子格

    分析:

    那么我们对于所有的未填写位置就可以进行一次dfs,对于每个位置枚举1~9九个数字看能不能填写,(能填写的就是符合题目的要求),对于行列比较容易,但是对于当前位置 (x,y) 所在的子格...借鉴了前辈的方法:如下:it=(x/3)*3,jt=(y/3)*3,那么 (it,jt) 就是当前位置坐在子格的左上角顶点, 可以任意列举几个点验证;;

    那么上马:

    #include<stdio.h>
    #include<string.h>
    
    int map[9][9];
    
    int flag[82][2];//用来标记没有填写的点坐标,因为最多只有81个格子
    int num;//没填写格子的个数
    
    bool judg(int x,int y,int k)
    {
    	int i,j;
    	//进行列和行的判断
    	for(i=0;i<9;i++)
    	{
    		if(map[i][y]==k)return false;
    		if(map[x][i]==k)return false;
    	}
    	//进行所在子格的判断
    	int it=(x/3)*3,jt=(y/3)*3;//这里是根据x,y来计算(x,y)所在子格的左上角的点坐标
    	for(i=0;i<3;i++)
    		for(j=0;j<3;j++)
    			if(map[i+it][j+jt]==k)
    				return false;
    	return true;
    }
    
    int dfs(int sum)//从没填写的子格数搜索,为0结束
    {
    	if(sum<0)return 1;
    	int x=flag[sum][0],y=flag[sum][1];
    	for(int i=1;i<=9;i++)//将(x,y)这点从1到9遍历看能否填写其中的数字
    		if(judg(x,y,i))
    		{
    			map[x][y]=i;
    			if(dfs(sum-1)) return 1;
    			map[x][y]=0;
    		}
    	return 0;
    }
    
    int main()
    {
    	int T;
    	int i,j;
    	char c;
    	scanf("%d",&T);
    	getchar();
    	while(T--)
    	{
    		num=0;
    		memset(flag,0,sizeof(flag));
    		for(i=0;i<9;i++)
    			for(j=0;j<9;j++)
    			{
    				scanf("%c",&c);
    				getchar();
    				map[i][j]=c-'0';
    				if(!map[i][j])
    				{
    					flag[num][0]=i;
    					flag[num++][1]=j;
    				}
    			}
    		dfs(num-1);
    
    		for(i=0;i<9;i++)
    		{
    			for(j=0;j<9;j++)
    				printf("%d",map[i][j]);
    			printf("
    ");
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    BAT 批处理脚本教程
    javascript定时器
    使用命令行打开文件夹并显示
    用cmd加密文件夹
    烟波钓叟歌概述讲解
    奇门遁甲的起源
    八卦基本知识
    word2vec和word embedding有什么区别?
    Privoxy shadowscocks代理
    Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求
  • 原文地址:https://www.cnblogs.com/james1207/p/3297036.html
Copyright © 2011-2022 走看看