验证数独

来源:互联网 发布:职业介绍所 知乎 编辑:程序博客网 时间:2024/05/17 23:55
具体规则如下:
每一行都用到1,2,3,4,5,6,7,8,9,位置不限,
每一列都用到1,2,3,4,5,6,7,8,9,位置不限,
每3×3的格子(共九个这样的格子)都用到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。
如下是一个正确的数独:
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9

Input

输入n个数独,你来验证它是否违反规则.
第一行为数独个数,第二行开始为第一个数独,之后为第二个,至第n个.
注意!每个数独之间有一个回车隔开!

Output

若正确则输出”Right”若不正确则输出”Wrong” 输出一个换一行

Sample Input

2
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9

1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8

Sample Output

Right
Wrong

Hint

1<=n<=20 (输入的数独个数)

不论输入的数独是错误的还是正确的,数据都保证每个数在1-9之间,即只会出现因为有相同的数而导致违反规则,而不会因为数字超出了1-9的范围而违反规则.------搜索练习


 

 

 

 

 

 

#include<stdio.h>
#include<string.h>

int a[10];
int ma[9][9];
int flag, f =1, flag2;

void judge_ge();
void judge_hl();


int main()
{
 int i,N,j;
 scanf("%d", &N);//输入的组数;
 while(N--)
 {
  flag = 0;
  flag2 =0;
  memset(a, 0, sizeof(a));
  memset(ma, 0, sizeof(ma));
  for(i = 0; i < 9; i++)
   for(j = 0; j < 9;j++)
   {
    scanf("%d", &ma[i][j]);
    
   }
   judge_ge();//判断3*3的格子;
   if(flag == 1)
    printf("Wrong\n");
   else
   {
    judge_hl();//判断行和列的冲突;
    if(flag2 == 0)
    {
     printf("Right\n");
    }
    else
    {
     printf("Wrong\n");
    }
   }
 }
 return 0;
}

void judge_ge()
{
 int i,j,k,m;
 for(i = 0; i < 9; i+=3)//判断九个大格子;
 {
  if(f % 3 == 1)//让f在1~3之间;
  {
   for(m = i; m < i+3; m++)//判断0~2列的三个大格子;
    for(j = 0; j < 3;j++)
    {
     a[ma[m][j]]++;
     if(a[ma[m][j]] > 1)
     {
      flag = 1;
      break;
     }
    }
    if(flag == 1)
     break;
    else
     memset(a, 0, sizeof(a));
    
  }
  else if(f % 3 == 2)
  {
   for(m = i; m < i+3; m++)//判断3~5列的格子;
    for(j = 3; j < 6; j++)
    {
     a[ma[m][j]]++;
     if(a[ma[m][j]] > 1)
     {
      flag = 1;
      break;
     }
    }
    if(flag == 1)
     break;
    else
     memset(a, 0, sizeof(a));
  }
  else if(f % 3 == 3)
  {
   for(m = i; m < i +3; m++)//判断6~8列的格子;
    for(j = 6; j < 9; j++)
    {
     a[ma[m][j]] ++;
     if(a[ma[m][j]] > 1)
     {
      flag = 1;
      break;
     }
    }
    if(flag == 1)
     break;
    else
     memset(a, 0, sizeof(a));
    
  }
 }
}

void judge_hl()
{
 int i,j;
 for(i = 0; i < 9; i++)
 {
  memset(a, 0, sizeof(a));
  flag2 = 0;
  for(j = 0; j < 9; j++)//验证行的数独;
  {
      if(a[ma[i][j]] > 1)
   {
    flag2 = 1;
     break;
   }
   if(flag2 == 1)
    break;
   else
   {
    memset(a,0, sizeof(a));
   }
  }
  
  for(j = 0; j < 9;j++)
  {
     a[ma[j][i]]++;
   if(a[ma[j][i]] > 1)
   {
    flag2 = 1;
    break;
   }
  }
  if(flag2 == 1)
   break;
 }
}

 

 

原创粉丝点击