2018-07-02 13:52

# 关于c++里静态变量的实例化

Leetcode上的题（所以请不要在class Solution外改），我想声明一个空指针（直接用nullptr没法用，说我auto推断类型错误）用static cube NullCube[9][9]; 在cube类里声明了。但是运行时显示NullCube没有实例化，在各处加上cube::NullCube都没法成功，不知道应该怎么修改？

``````#include <vector>
#include <iostream>

using std::vector;

class Solution {
class cube{
public:
int value=-1;
int avail[10] = {1,1,1,1,1,1,1,1,1,1}; //avail<=0 means not available
int stillAvail=10;
static cube NullCube[9][9];            /////////////////////////WHYYYYYY CAN'T I USE THIS POINTER????????
static bool cube_put(int num,int x,int y,cube board[9][9]){
board[x][y].value=num;
int i,j;
int flag = true;
for(i=0;i<9;i++) {
flag = flag && RmvPsb(num, i, y, board);
flag = flag && RmvPsb(num, x, i, board);
if (x == y) flag = flag && RmvPsb(num, i, i, board);
if (x + y == 8) flag = flag && RmvPsb(num, i, 8 - 1, board);
}
return flag;
};

static bool RmvPsb(int num,int x,int y,cube board[9][9]){
board[x][y].avail[num] -=1;
if(board[x][y].avail[num]==0) board[x][y].stillAvail-=1;
if(board[x][y].value == -1 && board[x][y].stillAvail<=0) return false;
return true;
}
static bool locale0(cube board[9][9],int &x,int &y){
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if(board[i][j].value==-1){
x=i;
y=j;
return true;
}
}
}
std::cout<<"no more -1 now!";
return false;
}

static auto search(cube board[9][9]){
int x,y;
if(!locale0(board,x,y)) return board;
std::cout<<"searching for: \n";
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
std::cout<<board[i][j].value<<" ";
}
std::cout<<"\n";
}
for (int i = 0; i <= 9; ++i) {
if(board[x][y].avail[i]==1){
cube board_[9][9];
for (int j = 0; j < 9; ++j) {
for (int k = 0; k < 9; ++k) {
board_[j][k]=board[j][k];
}
}//copy a new board
if(cube_put(i,x,y,board_)== false){
continue;
}
auto p=search(board_);
if(p!= NullCube) {std::cout<<"find it"<<p<<"\n";return p;}
}
}
return NullCube;
}
};

public:
void solveSudoku(vector<vector<char>>& board) {
cube::NullCube;
int i,j;
cube b[9][9];
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(board[i][j]!='.'){
cube::cube_put(int(board[i][j]-'0'),i,j,b);
}
}
}
cube::search(b);
}
};

int main(){
char s[9][9]= {{'5','3','.','.','7','.','.','.','.'},{'6','.','.','1','9','5','.','.','.'},{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},{'4','.','.','8','.','3','.','.','1'},{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},{'.','.','.','4','1','9','.','.','5'},{'.','.','.','.','8','.','.','7','9'}};

vector<vector<char>> v(9,vector<char>(9));
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
v[i][j]=s[i][j];
}
}

Solution c;
c.solveSudoku(v);
return 0;
}

``````
• 写回答
• 好问题 提建议
• 关注问题
• 收藏
• 邀请回答

#### 3条回答默认 最新

• zale_lzj 2018-07-04 03:57
已采纳

cube类内的静态成员变量，还需要在外边定义吧；不过类内的static静态成员变量可以在声明时立即初始化，不知道这样编译器会不会通过此段代码。

建议修改数据结构呀，初略看了看代码，感觉可以用数组替代的

已采纳该答案
评论
解决 无用
打赏 举报
• devmiao 2018-07-02 15:45
评论
解决 无用
打赏 举报
• wjintao 2018-07-16 06:00

个人建议将NullCube修改为search()方法的局部变量，你可以试试

评论
解决 无用
打赏 举报