求大牛解析ACM题目
最近小菜开始研究ACM的题目...不料第一题就卡住了.. 试题地址如下:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
小菜用了回溯的方法做,例子各种过!可惜编译说是Wrong Answer!求各位大牛指点我!
到底哪里出了错!
代码如下:
#include <iostream>
using namespace std;
int N;
char imap[100][100];
int iTowerNum = 0;
int iCounts = 0;
int Judge(int , int);
void BackTrack(int, int);
int main()
{
while(cin>>N)
{
for(int i = 0;i<N;++i)
{
for(int j = 0;j<N;++j)
{
cin>>imap[i][j];
}
}
BackTrack(0,0);
cout<<iTowerNum<<endl;
iTowerNum = 0;
}
return 0;
}
void BackTrack(int line, int row) //回溯遍历函数
{
int i = line;
int j = row;
if( i == N ) //判断是否到底了
{
if(iCounts > iTowerNum)
iTowerNum = iCounts;
return ;
}
for(; i<N; ++i)
{
for(; j<N; ++j)
{
if( Judge(i,j))
{
imap[i][j] = 'o';
iCounts++;
if(j+1==N)
{
BackTrack(i+1,0);
}
else
{
BackTrack( i, j+1);
}
iCounts--;
imap[i][j] = '.';
}
if( i == N-1 && j == N-1) //判断是否是最后一位
{
if(iCounts > iTowerNum)
iTowerNum = iCounts;
return ;
}
}
j = 0;
}
return;
}
int Judge(int line , int row)
{
int i;
if ( imap[line][row] == 'X')
return 0;
for( i = line-1 ; i>=0; --i)
{
if(imap[i][row] =='o')
return 0;
else if (imap[i][row] == 'X')
break;
}
for( i = line+1 ; i<N ; ++i)
{
if(imap[i][row] =='o')
return 0;
else if (imap[i][row] == 'X')
break;
}
for( i = row-1 ; i>=0 ; --i)
{
if(imap[line][i] =='o')
return 0;
else if (imap[line][i] == 'X')
break;
}
for( i = row+1 ; i<N ; ++i)
{
if(imap[line][i] =='o')
return 0;
else if (imap[line][i] == 'X')
break;
}
return 1;
}
[解决办法]
zju这题对于初学者的确有点吓人。但是的确是朴素DFS,因为n最大4。
lz的问题是题目里这句followed by a line containing the number 0 that signals the end of the file
所以输入0程序应该直接退出。