[英]Minesweeper Program, unexpected output
我正在做一個來自 Steven Skiena(編程挑戰)的問題(掃雷)。 在那里你必須 output 與那個廣場相鄰的地雷數量。
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
char a[m][n];
for(int i=0;i<m;i++)
{
for (int j = 0; j < n; j++)
{
cin>>a[i][j];
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if(a[i][j]!='*')
{
int no=0;
if(a[i-1][j-1]=='*')
no++;
else if(a[i][j-1]=='*')
no++;
else if(a[i+1][j-1]=='*')
no++;
else if(a[i+1][j]=='*')
no++;
else if(a[i+1][j+1]=='*')
no++;
else if(a[i][j+1]=='*')
no++;
else if(a[i-1][j+1]=='*')
no++;
else if(a[i-1][j]=='*')
no++;
a[i][j]=(char)no;
}
}
}
for(int i=0;i<m;i++)
{
for (int j=0; j<n; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
return 0;
}
當我嘗試運行這個程序時,沒有放置地雷的數組是空白的。 是不是跟integer選角色有關?
一個錯誤是這樣的:
a[i][j]=(char)no;
這不是將一位數 integer 轉換為char
表示的方式。
正確的方法是在 integer 上加'0'
:
a[i][j] = no + '0';
這樣做的原因是數字的字符表示與實際數字值不同。 例如,ASCII 整理序列使用 48 作為字符'0'
,49 作為'1'
,50 作為'2'
,等等。
因此添加'0'
,即 48,將為您提供數字的字符表示。
你可以像這樣改變你的程序:
我將您的數組更改為 int 數組,所有地雷都是-1
。 因此,您不必在一個數組中混合使用 int 值和 char 值。 有了這個,你必須用 if 條件在 output 中處理這個。
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
char a[m][n];
for(int i=0;i<m;i++)
{
for (int j = 0; j < n; j++)
{
char in;
cin>>in;
if(in == '*') {
a[i][j] = -1;
} else {
a[i][j] = 0;
}
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if(a[i][j]!=-1)
{
int no=0;
if(a[i-1][j-1]==-1)
no++;
else if(a[i][j-1]==-1)
no++;
else if(a[i+1][j-1]==-1)
no++;
else if(a[i+1][j]==-1)
no++;
else if(a[i+1][j+1]==-1)
no++;
else if(a[i][j+1]==-1)
no++;
else if(a[i-1][j+1]==-1)
no++;
else if(a[i-1][j]==-1)
no++;
a[i][j]=no;
}
}
}
for(int i=0;i<m;i++)
{
for (int j=0; j<n; j++)
{
if(a[i][j] == -1) {
cout<<" * ";
} else {
cout<<" "<<a[i][j]<<" ";
}
}
cout<<endl;
}
return 0;
}
既然看起來人們在給男人送魚,我看不出有什么理由不這樣做。 在計算上改變一個很好的解決方案的 no 啟動方式。
char no='0';
我在這里看到一些單獨的問題,它們共同導致了您遇到的問題。
首先,如上所述,一旦您計算了與每個地雷相鄰的地雷數量,您當前存儲結果的方式將不會按照您期望的方式打印。 這里的其他答案建議了幾種不同的方法可以做到這一點。
其次,您計算相鄰地雷的方法(稍微)不正確。 讓我們看看這段代碼:
if(a[i-1][j-1]==-1)
no++;
else if(a[i][j-1]==-1)
no++;
else if(a[i+1][j-1]==-1)
no++;
else if(a[i+1][j]==-1)
no++;
else if(a[i+1][j+1]==-1)
no++;
else if(a[i][j+1]==-1)
no++;
else if(a[i-1][j+1]==-1)
no++;
else if(a[i-1][j]==-1)
no++;
您在此處使用的模式if
/ else if
/ else if
/... 意味着最多將執行其中一個分支。 也就是說,一旦此代碼找到地雷,它就會停止查看單元格周圍的其他位置以查找其他地雷。 解決此問題的一種方法是使它不是if
/ else if
的鏈,而只是if
的常規鏈:
if(a[i-1][j-1]==-1)
no++;
if(a[i][j-1]==-1)
no++;
if(a[i+1][j-1]==-1)
no++;
if(a[i+1][j]==-1)
no++;
if(a[i+1][j+1]==-1)
no++;
if(a[i][j+1]==-1)
no++;
if(a[i-1][j+1]==-1)
no++;
if(a[i-1][j]==-1)
no++;
您甚至可能想考慮更改您的結構,這樣您就可以使用雙重嵌套的 for 循環來枚舉距離您一步之遙的所有位置,而不是使用一長串if
語句。 這將壓縮代碼並使其更清楚地匹配“對於每個相鄰位置,如果它是地雷,則將其算作地雷”的模式。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.