2020年8月4日 星期二

10189 - Minesweeper

解題心得:
注意最後一筆測資後不需換行。

程式碼:

[解一]
#include <iostream>
using namespace std;

int main()
{
    int n,m,times=1;
    while(cin>>n>>m)
    {
        if(n==0&&m==0) break; 
        if(times!=1) cout<<endl;
        char map[105][105];
        for(int i=0;i<100;i++)
            for(int j=0;j<100;j++)
                map[i][j]='0';
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>map[i][j];
        cout<<"Field #"<<times++<<":"<<endl;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(map[i][j]=='*') cout<<map[i][j];
                else
                {
                    int count=0;
                    for(int x=i-1;x<=i+1;x++)
                    {
                        for(int y=j-1;y<=j+1;y++)
                        {
                            if(map[x][y]=='*') count++;
                        }
                    }
                    cout<<count;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}
[解二]
#include <iostream>
using namespace std;

int main()
{
	int n, m, counter = 1;
	int dx[8] = { -1,-1,-1,0,0,1,1,1 }, dy[8] = { -1,0,1,-1,1,-1,0,1 };
	while (cin >> n >> m && n && m)
	{
		if (counter != 1) cout << endl;
		char arr[101][101];
		for (int i = 0; i < 101; i++)
			for (int j = 0; j < 101; j++)
				arr[i][j] = '0';
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> arr[i][j];
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				if (arr[i][j] != '*')
				{
					int total = 0;
					for (int k = 0; k < 8; k++)
					{
						if (arr[i + dx[k]][j + dy[k]] == '*')
							total++;
					}
					arr[i][j] = total + '0';
				}
			}
		}
		cout << "Field #" << counter++ << ":" << endl;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
				cout << arr[i][j];
			cout << endl;
		}
	}
	return 0;
}

沒有留言:

張貼留言