我一直试图让这个数独游戏运转起来,而且我仍然没有完成一些单独的功能。游戏一起工作,但当我通过“自动编程器”运行时,一些测试用例失败了.. 目前我被困在以下函数,placeValue,失败。我确实得到的输出与正确的输出相比,但我很困惑......发生了什么事?
编辑:我不知道他们对该功能做了什么输入/调用。
在每次调用placeValue之后输出“无效行”,我无法追查原因......
这是输出(我的+正确的),如果它有用的话:http://pastebin.com/Wd3P3nDA
这是placeValue,以下是placeValue调用的getCoords ..
void placeValue(Square board[BOARD_SIZE][BOARD_SIZE])
{
int x,y,value;
if(getCoords(x,y))
{
cin>>value;
if(board[x][y].permanent)
{
cout<< endl << "That location cannot be changed";
}
else if(!(value>=1 && value<=9))
{
cout << "Invalid number"<< endl;
clearInput();
}
else if(validMove(board, x, y, value))
{
board[x][y].number=value;
}
}
}
bool getCoords(int & x, int & y)
{
char row;
y=0;
cin>>row>>y;
x = static_cast<int>(toupper(row));
if (isalpha(row) && (x >= 'A' && x <= 'I') && y >= 1 && y <= 9)
{
x = x - 'A'; // converts x from a letter to corresponding index in matrix
y = y - 1; // converts y to corresponding index in matrix
return (true);
}
else if (!(x >= 'A' && x <= 'I'))
{
cout<<"Invalid row"<<endl;
clearInput();
return false;
}
else
{
cout<<"Invalid column"<<endl;
clearInput();
return false;
}
}
答案 0 :(得分:2)
(复制我对原帖的评论)像这样盲目工作是毫无意义的。评分员会向您显示您的程序输出,对吧?所以只需将stdin回显到stdout,然后将其粘贴到此处,以便我们可以看到您应该处理的内容:string s; while (getline(cin, s)) cout<<s<<endl;
同时:
如果出现解析错误,您的clearInput()
函数只是读取并忽略直到行尾。如果这就是他们这样做的话,那么使用getline()
来读取一行然后解析它会容易得多。
只是为了踢,这是getCoords
函数的更强大版本:
bool getCoords(int& x, int& y, int& value)
{
string s;
getline(cin, s);
istringstream ss(s);
char a, b, c;
ss >> a >> b >> c >> ws;
if (ss.fail() || !ss.eof()) return false;
a = toupper(a);
if (a < 'A' || a > 'I') return false;
x = a - 'A';
if (b < '1' || b > '9') return false;
y = b - '1';
if (c < '1' || c > '9') return false;
value = c - '1';
return true;
}
clearInput()
。 只需将getCoords(x,y)
来电替换为getCoords(x, y, value)
,然后取出cin>>value;
行。
答案 1 :(得分:0)
您可能还应该修复此行:
cout << endl << "That location cannot be changed";
到
cout << "That location cannot be changed" << endl;
可能的修复可能是如果行无效,则不应读取该列。这是一个非常模糊的猜测。
这会假设输入看起来像
A1 9
C3 3
d 9 8
q
A3 9
你的解析器会在那个输入处失败...我不确定他们对输入有多么意思。
我也不确定你实现这个有多大的自由,但如果你逐行解析,通常最好使用getline(),然后解析每个字符串。这需要一些重构。
再次,真正的意思是输入。这里有人认为他们会提供以下意见吗?
A 1 3
A
A 2 4
在这种情况下,(s)他真的必须使用getline()或noskipws以及一些在家庭作业环境中非常有意义的额外解析逻辑。
为了对我为什么猜这个问题进行一些探讨,似乎你缺少输出线。在我看来,在每个输入阅读阶段,您可能正在阅读两行输入,而不是一行。
答案 2 :(得分:0)
如果在每个输入后打印无效行,我们必须得出结论:您的代码正在执行它所说的内容:它认为每行都在A-I范围之外。很可能一些输入使你的cin进入冻结状态并且cin&gt;&gt;行实际上要么是坚持0,要么根本没有任何行,因此它经常无法检查并打印消息。
答案 3 :(得分:0)
教授进一步澄清:
如果用户输入'P'然后按回车键,程序将等待进一步输入(意味着它正在等待行,然后是y然后是值)
所以,我不需要考虑像
这样的输入A