原文

中文

 

C++

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 
int main()
{
    int i,t,j,m,n,c=1;
     
    while(cin>>n>>m&&(n!=0&&m!=0))//輸入行列數 
    {
    	if(c>1)//輸出下一筆資料前換行 
    	{
    		cout<<endl;
		}
    	cout<<"Field #"<<c<<":"<<endl;//照格式輸出
		 
    	string s1[n+2]={""};
    	getline(cin,s1[0]);//cin接getline會有問題要多打一次 
    	
    	for(i=1;i<=n;i++)//輸入測資 
    	{
    		getline(cin,s1[i]);
    		s1[i]="0"+s1[i]+"0";//怕有超出陣列的範圍的問題 
    							//多加一圈0在外面 
		}
		for(i=0;i<m+2;i++)//多加一圈0 
    	{
    		s1[0]+="0";
    		s1[n+1]+="0";
		}
		
		for(i=1;i<=n;i++)//計算地雷數 
		{
			for(t=1;t<=m;t++)
			{
				if(s1[i][t]=='.')//只要檢查"." 
				{
					int count=0;
					stringstream ss;//把數字轉成字串用 
					ss.clear();//怕出錯先清空 
					
					for(j=-1;j<1;j++)//j不能等於1不然會重複檢查 
					{				 //下面的正負號也要注意好 
						if(s1[i-1][t+j]=='*')//檢查上面有沒有地雷 
						{
							count++;
						}
						if(s1[i+j][t+1]=='*')//右邊
						{
							count++;
						} 
						if(s1[i+1][t-j]=='*')//下面
						{
							count++;
						}
						if(s1[i-j][t-1]=='*')//左邊 
						{
							count++;
						}
					}
					
					ss<<count;//數字轉字串 
					ss>>s1[i][t];
				}
			}
		}
		
    	for(i=1;i<=n;i++)
    	{
    		s1[i].assign(s1[i],1,m);//把0去掉
    		
			//srt1.assign(str2,b,l)用法為把str2字串中
			//從b開始將l長度附值str1 
			
    		cout<<s1[i]<<endl;//輸出 
		}
		
		c++;//換下一筆測資 
	}
    return 0;
}
 
文章標籤
全站熱搜
創作者介紹
創作者 豪CO 的頭像
豪CO

程式道路,必為豐富

豪CO 發表在 痞客邦 留言(0) 人氣(1,303)