这题有点像八皇后那题,都是回溯,但比八皇后应该简单,不用判断是不是冲突了,这题要判断是否有解,有解就得返回了,没解继续找。思路还是比较简单的,卡在二维数组参数传递了,下面说一下二维数组作为参数的两种方法 1是 bool flag[][500] ,一定要后一个一位数组的长度,这个其实可以理解为flag是指向一维数组的指针,所以才要说明一维数组的长度,用的时候直接flag[i][j]就可以j+1地址移动一个字节,i+1移动一维数组长度个字节,我就是用的这个。第二种方法,比较操蛋,只知道传递方式,不知道怎么用,就是这个bool (*flag)[500][500],这里要注意的是flag是指向二维数组的指针,调用flag[i][j](和*(*(flag+i)+j)表示的一个意思)时,其表示的是指针,所以不能直接输出或赋值,说操蛋就是说用flag[i][j]时,flag[i][j+1]表示的是地址加的是列的长度,而flag[i+1][j]表示的是地址加 行的长度*列的长度 (和flag+i一样),而flag[i][j]+1才表示地址加一个字节 。所以要想取数组的元素应该用 *(pArray[0][0]+i+j) 或者 *((pArray[0][i]+j))。原题代码如下:
bool isExist(vector<vector<char> >&board,int row,int column,bool flag[][500],int i,int j,string str,int k)//bool (*flag)[500][500]
{
if(k==str.length())
return true;
if (i-1>=0&&!flag[i-1][j])
{
flag[i-1][j] = true;
if(board[i-1][j]==str[k]&&isExist(board,row,column,flag,i-1,j,str,k+1))
return true;
flag[i-1][j] = false;
}
if (i+1<row&&!flag[i+1][j])
{
flag[i+1][j] = true;
if(board[i+1][j]==str[k]&&isExist(board,row,column,flag,i+1,j,str,k+1))
return true;
flag[i+1][j] = false;
}
if (j-1>=0&&!flag[i][j-1])
{
flag[i][j-1] = true;
if(board[i][j-1]==str[k]&&isExist(board,row,column,flag,i,j-1,str,k+1))
return true;
flag[i][j-1] = false;
}
if (j+1<column&&!flag[i][j+1])
{
flag[i][j+1] = true;
if(board[i][j+1]==str[k]&&isExist(board,row,column,flag,i,j+1,str,k+1))
return true;
flag[i][j+1] = false;
}
return false;
}
bool exist(vector<vector<char> > &board, string word) {
int row = board.size();
int column=0;
if (row!=0)
{
column = board[0].size();
}
bool flag[500][500];
memset(flag,false,500*500);
for (int i=0;i<row;i++)
{
for (int j=0;j<column;j++)
{
if (board[i][j]==word[0])
{
memset(flag,false,500*500);
flag[i][j] = true;
if(isExist(board,row,column,flag,i,j,word,1))//flag
return true;
}
}
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<vector<char> >board;
//ret = combine(5,3);
vector<char> temp;
temp.push_back('A');
temp.push_back('B');
temp.push_back('C');
temp.push_back('E');
board.push_back(temp);
temp.clear();
temp.push_back('S');
temp.push_back('F');
temp.push_back('C');
temp.push_back('S');
board.push_back(temp);
temp.clear();
temp.push_back('A');
temp.push_back('D');
temp.push_back('E');
temp.push_back('E');
board.push_back(temp);
temp.clear();
cout<<exist(board,"ABCCED")<<endl;
cout<<exist(board,"SEE")<<endl;
cout<<exist(board,"ABCB")<<endl;
int array[10][10];
func4(&array);
system("pause");
return 0;
}
关于二维数组参数传递的用例:
void func4(int (*pArray)[3][4])
{
//*(*(pArray + i) + j) = 3;
int *p;
for (int i=0;i<3;i++)
{
for (int j=0;j<4;j++)
{
cout<<*(pArray[i][j]);//<<*(*(*(pArray + i) + j))<<" ";
}
cout<<endl<<endl;
}
for (int i=0;i<3*4;i+=4)
{
for (int j=0;j<4;j++)
{
p = pArray[0][0]+i+j;
cout<<*p<<" ";//*(pArray[i][j]+i+j)//<<*(*(*(pArray + i) + j))<<" ";
}
cout<<endl<<endl;
}
for (int i=0;i<3;i++)
{
p = pArray[0][i];//(pArray[0][i]+j)
for (int j=0;j<4;j++)
{
cout<<*(p+j)<<" ";
}
cout<<endl<<endl;
}
}
void func5(int pArray[][4])
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
cout<<pArray[i][j]<<" ";
}
cout<<endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
func4(&array);
func5(array);
system("pause");
return 0;
}