警钟...
查看原帖
警钟...
1382196
WhaT_iS_My_naMe楼主2024/9/30 19:10

我最开始(其实是一直)用的暴搜枚举,出现了几个问题:

#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[514][514];
int Count[514][514];
int xf[]
{
    1, 0, -1, 0
};
int yf[]
{
    0, 1, 0, -1
};

int bfs()
{
    int cnt = 0;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < k; ++j)
        {
            if(!(Count[i][j]) && a[i][j] == '#')
            {
                int xlen;
                for(xlen = 0; xlen < n; ++xlen)
                {
                    if(a[i + xlen][j] != '#' || Count[i + xlen][j])
                    {
                        break;
                    }
                }
                int ylen;
                for(ylen = 0; ylen < k; ++ylen)
                {
                    if(a[i][j + ylen] != '#' || Count[i][j + ylen])
                    {
                        break;
                    }
                }
                int x, y;
                for(x = 0; x < n; ++x)
                {
                    if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
                    {
                        break;
                    }
                }
                for(y = 0; y < k; ++y)
                {
                    if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
                    {
                        break;
                    }
                }
                if(x != xlen || y != ylen)
                {
                    cout << "Bad placement." /<< endl;
                    return 0;
                }
                cnt++;
                for(int k = i; k < i + xlen; ++k)
                {
                    for(int l = j; l < j + ylen; ++l)
                    {
                        Count[k][l] = 1;
                    }
                }
            }
        }
    }
    return cnt;
}
int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; ++i)
    {
    	string tmp;
    	cin >> tmp;
    	for(int j = 0; j < k; ++j)
    	{
    		a[i][j] = tmp[j];
		}
    }
    int x = bfs();
    if(x)
    {
    	cout << "There are " << x << " ships.";
	}
}

经过下载数据进行研究,发现是类似于如下测试点:

3 3
###
.#.
...
与
5 5
....#
....#
....#
....#
#####
之类的数据导致的。

接着修改为:

#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[114][514];
int Count[114][514];
int xf[]
{
    1, 0, -1, 0
};
int yf[]
{
    0, 1, 0, -1
};

int bfs()
{
    int cnt = 0;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < k; ++j)
        {
            if(!(Count[i][j]) && a[i][j] == '#')
            {
            	bool b = 0;
                int xlen;
                for(xlen = 0; xlen < n; ++xlen)
                {
                    if(a[i + xlen][j] != '#' || Count[i + xlen][j])
                    {
                    	
                        break;
                    }
                }
                int ylen;
                for(ylen = 0; ylen < k; ++ylen)
                {
                    if(a[i][j + ylen] != '#' || Count[i][j + ylen])
                    {
                        break;
                    }
                }
                int x, y;
                for(x = 0; x < n; ++x)
                {
                    if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
                    {
                        break;
                    }
                }
                for(y = 0; y < k; ++y)
                {
                    if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
                    {
                        break;
                    }
                }
                if(a[i + xlen][j] == '#' || a[i][j + ylen] == '#')
                {
                	b = 1;
				}
                if(x != xlen || y != ylen || b)
                {
                    cout << "Bad placement." << endl;
                    return 0;
                }
                cnt++;
                for(int k = i; k < i + xlen; ++k)
                {
                    for(int l = j; l < j + ylen; ++l)
                    {
                        Count[k][l] = 1;
                    }
                }
            }
        }
    }
    return cnt;
}
int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; ++i)
    {
    	string tmp;
    	cin >> tmp;
    	for(int j = 0; j < k; ++j)
    	{
    		a[i][j] = tmp[j];
		}
    }
    int x = bfs();
    if(x)
    {
    	cout << "There are " << x << " ships.";
	}
}

但是这样还是不够,需要把if(a[i + xlen][j] == '#' || a[i][j + ylen] == '#') { b = 1; }修改为for(int k = j; k < j + ylen; ++k) { if(a[i + xlen][k] == '#') b = 1; } for(int k = i; k < i + xlen; ++k) { if(a[k][j + ylen] == '#') b = 1; } 结果又发现数组开小了,于是把大小调成了[1145][1145]。 才总算解决了这题:

#include<bits/stdc++.h>
using namespace std;
int n, k;
char a[114][514];
int Count[114][514];
int xf[]
{
    1, 0, -1, 0
};
int yf[]
{
    0, 1, 0, -1
};

int bfs()
{
    int cnt = 0;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < k; ++j)
        {
            if(!(Count[i][j]) && a[i][j] == '#')
            {
            	bool b = 0;
                int xlen;
                for(xlen = 0; xlen < n; ++xlen)
                {
                    if(a[i + xlen][j] != '#' || Count[i + xlen][j])
                    {
                    	
                        break;
                    }
                }
                int ylen;
                for(ylen = 0; ylen < k; ++ylen)
                {
                    if(a[i][j + ylen] != '#' || Count[i][j + ylen])
                    {
                        break;
                    }
                }
                int x, y;
                for(x = 0; x < n; ++x)
                {
                    if(a[i + x][j + ylen - 1] != '#' || Count[i + x][j + ylen - 1])
                    {
                        break;
                    }
                }
                for(y = 0; y < k; ++y)
                {
                    if(a[i + xlen - 1][j + y] != '#' || Count[i + xlen - 1][j + y])
                    {
                        break;
                    }
                }
                for(int k = j; k < j + ylen; ++k)
                {
                	if(a[i + xlen][k] == '#') b = 1;
				}
				for(int k = i; k < i + xlen; ++k)
				{
                	if(a[k][j + ylen] == '#') b = 1;
				} 
                if(x != xlen || y != ylen || b)
                {
                    cout << "Bad placement." /*<< i << ' ' << j << ' ' << xlen << ' ' << ylen << ' ' << x << ' ' << y*/<< endl;
                    return -1;
                }
                for(int k = i; k < i + xlen; ++k)
                {
                    for(int l = j; l < j + ylen; ++l)
                    {
                    	if(a[k][l] != '#')
                    	{
		                    cout << "Bad placement." << endl;
		                    return -1;
						}
                        Count[k][l] = 1;
                    }
                }
                cnt++;
            }
        }
    }
    return cnt;
}
int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; ++i)
    {
    	string tmp;
    	cin >> tmp;
    	for(int j = 0; j < k; ++j)
    	{
    		a[i][j] = tmp[j];
		}
    }
    int x = bfs();
    if(x >= 0)
    {
    	cout << "There are " << x << " ships.";
	}
}
2024/9/30 19:10
加载中...