程序的意外输出
Unexpected Output of the program
问题说明:http://www.spoj.com/problems/NAKANJ/我的解决方案:
#include<bits/stdc++.h>
using namespace std;
int x[10]={0,2,2,-2,-2,1,1,-1,-1};
int y[10]={0,1,-1,1,-1,2,-2,2,-2};
int bfs(int a1,int b1,int a2,int b2)
{
pair<int,int> p;
int i;
queue<pair<int,int> >q;
int moves[9][9],visit[9][9],m,n;
memset(moves,0,sizeof(moves));
memset(visit,0,sizeof(visit));
p.first=a1;
p.second=b1;
q.push(p);
moves[a1][b1]=0;
while(!q.empty())
{
p=q.front();
q.pop();
if(p.first==a2&&p.second==b2)
return moves[a2][b2];
for(i=1;i<=8;i++)
{
m=p.first+x[i];
n=p.second+y[i];
if(m>8||m<1||n>8||n<1)
continue;
else
{
visit[m][n]=1;
moves[m][n]=moves[p.first][p.second]+1;
q.push(make_pair(m,n));
}
}
}
}
int main()
{
long long int t;
cin>>t;
while(t--)
{
string d,f;
cin>>d>>f;
int s=d[0]-'a';int r=f[0]-'a';
cout<<bfs(s+1,(int)d[1],r+1,(int)f[1])<<endl;
}
return 0;
}
Input :
3
a1 h8
a1 c2
h8 c3
output :
-1217403904
-1217403904
-1217403904
这个奇怪输出的原因是什么?逻辑和算法实现对我来说似乎很好。
您的moves
数组有9行9列-
int moves[9][9];
当你从这样的动作返回一些东西时-
if(p.first==a2&&p.second==b2)
return moves[a2][b2];
检查a2和b2是否小于9 -
if(p.first==a2&&p.second==b2){
if(a2 < 9 && b2 <9){
return moves[a2][b2];
}
}
您的bfs()
函数到达终点而不返回任何东西,并且预计将返回int
。
这意味着你要么忽略编译器的警告,要么使其沉默,在这两种情况下,这都是一个坏主意,打开警告并听取它们,它们告诉你,你的代码几乎肯定有错误。
也不要这样做
int s=d[0]-'a';int r=f[0]-'a';
这是一段质量太低的代码,让你的程序几乎无法理解,像这样做
int s;
int r;
s = d[0] - 'a';
r = f[0] - 'a';
我认为这可能是问题所在:
当你要转换一个非数字的字符时,你应该这样做:
int char_not_digit = char - 'a' ;
,当将数字转换为int型时,
int char_digit = char - '0';
看这里的解决方案
因此,输入字符串中的所有第0个位置字符应通过减去'a'
来转换为int
,而输入字符串中的所有第1个位置字符应通过减去'0'
来转换为int
。
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 字符串比较中的意外输出
- 每次在 c++ 中输出不同(意外行为)
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 标准输出C++意外行为
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出