注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
- // sudoku.cpp : Defines the entry point for the console application.
- //
- #include <iostream>
- #include <vector>
- using namespace std;
- const int N = 9;
- void valid(const int a[N][N], int x, int y, vector<int>& validList)
- {
- for(int m=1; m<=N; m++)
- {
- bool flag = true;
- for(int j = 0; j<N; j++)
- {
- if(a[x][j] == m) //每行只能出现一次
- {
- flag = false;
- break;
- }
- if(a[j][y] == m)//每列只能出现一次
- {
- flag = false;
- break;
- }
- int xx,yy;//每3*3格子只能出现一次
- xx = (x/3)*3 + j/3;
- yy = (y/3)*3 + j%3;
- if(a[xx][yy] == m)
- {
- flag = false;
- break;
- }
- }
- if(flag) validList.push_back(m);
- }
- }
- int b[N][N] = {
- 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 3, 6, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 9, 0, 2, 0, 0,
- 0, 5, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 0, 0, 4, 5, 7, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 3, 0,
- 0, 0, 1, 0, 0, 0, 0, 6, 8,
- 0, 0, 8, 5, 0, 0, 0, 1, 0,
- 0, 9, 0, 0, 0, 0, 4, 0, 0
- };
- void print(int a[N][N])
- {
- for(int i=0; i<N; i++)
- {
- for(int j=0; j<N; j++)
- {
- printf("%d ", a[i][j]);
- }
- printf(" ");
- for(int j=0; j<N; j++)
- {
- printf("%d ", b[i][j]);
- }
- printf("\n");
- }
- cout<<endl;
- }
- bool success = false;
- bool solve(int a[N][N], int x, int y)
- {
- while(a[x][y] != 0)
- {
- if(++y==9)
- {
- y=0;
- x++;
- if(x==9) //到达右下角,游戏结束
- return true;
- }
- }
- if(b[x][y] != 0) return false;
- vector<int> validList;
- valid(a, x, y, validList); // 将这个格子所有可以填的数字放到list里
- if(validList.size() == 0) return false;
- //遍历这个list,每个数填进去试一试
- for(int i=0; i<validList.size(); i++)
- {
- a[x][y]=validList[i];
- bool f=solve(a, x,y);//递归试算
- if(f) return true;
- a[x][y]=0;
- }
- return false;
- }
- int main()
- {
- int a[N][N] = {
- 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 3, 6, 0, 0, 0, 0, 0,
- 0, 7, 0, 0, 9, 0, 2, 0, 0,
- 0, 5, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 0, 0, 4, 5, 7, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 3, 0,
- 0, 0, 1, 0, 0, 0, 0, 6, 8,
- 0, 0, 8, 5, 0, 0, 0, 1, 0,
- 0, 9, 0, 0, 0, 0, 4, 0, 0
- };
- solve(a,0,0);
- print(a);
- return 0;
- }
复制代码 我没搞清楚,a[0][0]=b[0][0]=8,运行到84行应该直接返回false了啊,怎么还能接着运行下去?
|