Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122000
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: C/C++

2014-09-20 16:31:27

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

A sudoku puzzle...


...and its solution numbers marked in red.


Have you been asked this question in an interview?

首先leetcode只要求9*9的输入,所以不可能出现时间和空间不够用的问题。
基本思路是回溯,回溯类似就是DFS,不同的是某层失败后要回到上一层,失败的一层要恢复原样。
另外,回溯也要使用递归,递归需要有收敛条件,就是要有一段code,不会调用自身而返回。
在我写的code里面,就是
  1. if(i==n*m)
  2.             return true;

  1. int n,m;
  2.     bool check(int k, vector<vector<char> > &board){
  3.         int x=k/n;
  4.         int y=k%m;
  5.         for (int i = 0; i < n; i++)
  6.             if (i != x && board[i][y] == board[x][y])
  7.                 return false;
  8.         for (int j = 0; j < m; j++)
  9.             if (j != y && board[x][j] == board[x][y])
  10.                 return false;
  11.         for (int i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++)
  12.             for (int j = 3 * (y / 3); j < 3 * (y / 3 + 1); j++)
  13.                 if (i != x && j != y && board[i][j] == board[x][y])
  14.                     return false;
  15.         return true;
  16.     }
  17.     bool f(int i, vector<vector<char> > &board){
  18.         if(i==n*m)
  19.             return true;
  20.         if(board[i/n][i%m]=='.'){
  21.             for(int k=1;k<=9;k++){
  22.                 board[i/n][i%m]=k+'0';
  23.                     if(true==check(i,board))
  24.                         if(true==f(i+1,board))
  25.                             return true;
  26.             }
  27.             board[i/n][i%m]='.';
  28.             return false;
  29.         }
  30.         else
  31.             return f(i+1,board);
  32.     }
  33.     void solveSudoku(vector<vector<char> > &board) {
  34.         n=board.size();
  35.         m=board[0].size();
  36.         f(0,board);
  37.     }

阅读(864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~