// ttt.cpp :
//
#include
"stdafx.h"
#include
<string.h>
#include
<iostream>
using
std::cout;
using
std::endl;
#define
SIZE 8
#if
0
int board[SIZE][SIZE] = {{1,1,5,5,1},
{1,1,0,0,0},
{1,0,2,0,0},
{4,1,4,1,0},
{3,3,1,3,2}};
#endif
#if
0
int board[SIZE][SIZE] = {{6,5,7},
{3,4,5},
{2,9,1}};
#endif
#if
1
int
board[SIZE][SIZE] = {{7,3,6,1,5,5,5,5},
{5,5,5,8,4,5,0,3},
{6,1,0,6,3,2,0,6},
{4,5,5,5,7,6,5,6},
{6,4,7,4,5,2,5,6},
{7,4,4,3,0,7,8,6},
{8,8,4,4,1,4,9,2},
{0,6,8,4,2,6,6,4}};
#endif
#if
0
int board[SIZE][SIZE] = {{9,5,0,4,8,7,1,7,2,7,9,5,0,4,8,7,1,7,2,7},
{2,2,6,1,0,6,5,5,9,4,2,2,6,1,0,6,5,5,9,4},
{9,0,9,1,7,7,1,1,5,9,9,0,9,1,7,7,1,1,5,9},
{7,7,6,9,6,6,5,6,3,8,7,7,6,6,4,6,6,6,3,8},
{4,8,1,7,9,3,9,0,8,8,4,8,1,7,9,3,9,0,8,8},
{5,0,7,6,3,8,5,6,1,1,5,0,7,6,3,8,5,6,1,1},
{7,7,8,4,8,1,0,5,0,4,7,7,8,4,8,1,0,3,0,4},
{7,4,4,4,4,3,1,7,5,9,7,4,4,4,4,3,1,7,5,9},
{6,2,1,7,8,5,7,4,1,5,6,2,1,7,8,5,7,4,1,8},
{5,9,7,5,3,8,8,3,1,8,5,9,7,5,3,8,8,3,1,8},
{9,5,0,4,8,7,1,7,2,7,9,5,0,4,8,7,1,7,2,7},
{2,2,6,1,0,6,5,5,9,4,2,2,6,1,0,6,5,5,9,4},
{9,0,9,1,7,7,6,1,5,9,9,0,9,1,7,7,1,1,5,9},
{7,7,6,9,6,6,5,6,3,8,7,7,6,9,6,6,5,6,3,8},
{4,8,1,7,6,3,9,0,8,8,4,8,1,7,9,3,9,0,8,8},
{5,0,7,6,3,8,5,6,1,1,5,0,7,6,3,8,5,6,1,1},
{7,7,6,4,8,1,0,3,0,4,7,7,8,4,8,1,0,3,0,4},
{7,4,4,4,4,3,1,7,5,9,7,4,4,4,4,3,1,7,5,9},
{6,2,1,7,8,5,7,4,1,8,6,2,1,7,8,5,7,4,1,8},
{5,9,7,5,3,8,8,3,1,8,5,9,7,5,3,8,8,3,1,8}};
#endif
int
FindMaxValue(int k[][SIZE], int nRow,int nColumn,int nsize, int *&pSum, int nNum)
{
//查找行
int nRowSum = 1;
for(int i=nColumn; i<nsize-1; ++i)
{
if(k[nRow][i] == k[nRow][i+1] && nNum == k[nRow][i])
{
nRowSum++;
}
}
//查找列
int nColumnSum = 1;
for(int i=nRow; i<nsize-1; ++i)
{
if(k[i][nColumn] == k[i+1][nColumn] && nNum == k[i][nColumn])
{
nColumnSum++;
}
}
//查找anti-对角线的值
int nAntiDiagonal = 1;
for(int i=nRow,j=nColumn; i<nsize-1,j<nsize-1; ++i,++j)
{
if(k[i][j] == k[i+1][j+1] && nNum == k[i][j])
nAntiDiagonal++;
}
//查找对角线的值
int nDiagonal = 1;
for(int i=nRow,j=nColumn; i<nsize-1,j<nsize-1,i>=0, j>=0; )
{
if(i == 0 && j == 0)
break;
while(j>0)
{
if(k[i][j] == k[i+1][j-1] && nNum == k[i][j])
{
nDiagonal++;
j--;
i++;
}
j--;
i++;
}
j = -1;
//为了跳出循环
}
//比较四个谁大
int nTemp1 = 0;
int nTemp2 = 0;
if(nRowSum>=nColumnSum)
nTemp1 = nRowSum;
else
nTemp1 = nColumnSum;
if(nAntiDiagonal>=nDiagonal)
nTemp2 = nAntiDiagonal;
else
nTemp2 = nDiagonal;
if(nTemp1>=nTemp2 && nTemp1>=pSum[nNum-1]) //最后得出的值,必须与已经存在的值比较
pSum[nNum-1] = nTemp1;
else if(nTemp2>=nTemp1 && nTemp2>=pSum[nNum-1])
pSum[nNum-1] = nTemp2;
return 0;
}
int
run_test(int k[SIZE][SIZE],int size)
{
//按照数字查找01234、、9
int* pSumNum = new int[9]; //1-9
memset(pSumNum, 0,
sizeof(int)*9);
for(int i=0; i<size; ++i) //row
{
for(int j=0; j<size; ++j) //column
{
switch(k[i][j])
{
case 1:
//查找行、列、对角线、反对绞线
FindMaxValue(k,i,j,size, pSumNum, 1);
break;
case 2:
//
FindMaxValue(k,i,j,size, pSumNum, 2);
break;
case 3:
//
FindMaxValue(k,i,j,size, pSumNum, 3);
break;
case 4:
//
FindMaxValue(k,i,j,size, pSumNum, 4);
break;
case 5:
//
FindMaxValue(k,i,j,size, pSumNum, 5);
break;
case 6:
//
FindMaxValue(k,i,j,size, pSumNum, 6);
break;
case 7:
//
FindMaxValue(k,i,j,size, pSumNum, 7);
break;
case 8:
//
FindMaxValue(k,i,j,size, pSumNum, 8);
break;
case 9:
//
FindMaxValue(k,i,j,size, pSumNum, 9);
break;
}
}
}
for(int i=0; i<9; ++i)
cout<<pSumNum[i]<<endl;
if(pSumNum)
{
delete pSumNum;
pSumNum = NULL;
}
return 0;
}
int
_tmain(int argc, _TCHAR* argv[])
{
run_test(board, SIZE);
system(
"pause");
return 0;
}