算法各种不给力,但是慢慢的研究下来发现其实挺有意思的。自己当时觉得老师讲得太水了,就毅然决然的没有选择算法课,但是大学四年我也咩有好好学习过算法。
突然想到大学就这么被我荒废掉的这么多旧时光,真是让人感伤。
想想上次去清华面试的时候,师兄问我们考试的情况,大家都说题目最后一题比较难,然后他听大家讲完题目之后,秒杀了最后一题,然后我就默默的跪倒了。
果真和清华的小朋友们有质的差距。。。第二天早上一电信的哥们十分自信的在描述最后一题是如何简单的时候,然后我就默默的慌张了,因为我压根就
不会,除了第一题飞快的搞定了之后。然后就自信满满的没有检查,导致一个月后回想起来都还纳闷第一题是循环输入还是单词输入的问题上心惊肉跳了一个月。
以前总是喜欢规避问题,然后当不得不面临问题的时候其实我什么也做不好。我学计算机网络的时候也是这个样子的,之前一个老师讲得非常好,然后换了个老师
立马开始水了。今天和小学弟在讨论网络的问题的时候,他问我没学过计算机网络么,然后我默默的忧伤了,曾几何时我是下了决心要以后死磕网络,然后读网络的
DR,现在看来好像本科不过关呢。
呀呀,明天又要继续奋斗了。
虽然今天搞了一天大家都认为很水的一道搜索算法题,但是我认认真真的想了才想出来的,虽然在VS通过了测试用例,但是悲剧的是过OJ的时候报了一个WA,郁闷。
仔细对比了一下网上的代码,是一样一样的,不管了。先回顾一下煎熬史。
哦,对了,之前学的C++大概是在某几次便便之后都拿去浇花了,所以导致我现在记不起一点C++,所以我明天开始要开始复习C++。
不对,明天要写开题报告。
今天死磕了一天,先总结一下问题,方便以后查缺补漏,提高自我,哈哈~
- C++各种不给力,很多方便的方法都不会用
- C语言的基础知识忘记了很多,比如说scanf()?就有遗忘
- 一些很好的编程技巧没有掌握,比如说scanf("%d\n",&x);这种语句是可以的,其次就是scanf的返回值问题
- 其次C语言的string.h用的还是各种不熟悉啊
- 代码还是很挫,需要进步
- 算法还是看少了,看少了!!!!
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 20850 | Accepted: 11150 |
Description
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#.
//可走的下一个点
if(x >= 0 && x <= H && y >=0 && y < W && cango[x][y] == '.' )
这样对于来的每一个点的上下左右做一次判断就ok了
DFS(p - 1, q);
DFS(p, q - 1);
DFS(p, q + 1);
DFS(p + 1, q);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_N 20
int W, H;
char a[MAX_N][MAX_N];
int res=1;
bool flag = false;
int dfs(int nx, int ny)
{
//搜索下面
if(nx>=0 && nx+1<H && ny>=0 && ny<W && a[nx+1][ny] =='.')
{
nx = nx+1;
a[nx][ny] = '#';
res++;
flag = true;
dfs(nx,ny);
}
//搜索左面
if(nx>=0 && nx<H && ny-1>=0 && ny<W && a[nx][ny-1]=='.')
{
ny = ny-1;
a[nx][ny] = '#';
res++;
flag = true;
dfs(nx,ny);
}
//搜索上面
if(nx-1>=0 && nx<H && ny>=0 && ny<W && a[nx-1][ny] =='.')
{
nx = nx-1;
a[nx][ny] = '#';
res++;
flag = true;
dfs(nx,ny);
}
//搜索右面
if(nx>=0 && nx<H && ny>=0 && ny+1<W && a[nx][ny+1]=='.')
{
ny = ny +1;
a[nx][ny] = '#';
res++;
flag = true;
dfs(nx,ny);
}
if(flag == false)
return res;
return res;
}
int main()
{
int nx=0,ny=0;
char c;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int x,y;
while(scanf("%d%d\n",&W, &H) && (W || H)){for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
{
nx = i;
ny = j;
a[nx][ny] = '#';
}
}
c=getchar();
}
for(int i = 0; i < 4; i++)
{
x = nx + dx[i];
y = ny + dy[i];
if(a[x][y]=='.')
{
res=dfs(nx,ny);
}
}
printf("%d\n",res);res=1;}
//system("PAUSE");
return 0;
}
最悲剧的事情就是无论如何也跑不出AC,到底是哪个情况没有考虑到啊????无论如何,在我睡了一天之后觉得代码可以改进,不自觉的看了看大神们的代码
//#define LOCAL
#include <stdio.h>
#include <string.h>
#define MAXN 20 + 10
char graph[MAXN][MAXN];
int m, n;
int result;
void DFS(int p, int q);
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempIn.txt", "r", stdin);
//freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempOut.txt", "w", stdout);
#endif
int i, j;
int p, q;
while(scanf("%d%d", &n, &m) && m != 0)
{
// 数据的初始化
result = 0;
memset(graph, 0, sizeof(graph));
// 数据输入
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
{
scanf("\n%c", &graph[i][j]);
if(graph[i][j] == '@')
{
p = i;
q = j;
graph[i][j] = '.';
}
}
// 算法主体
DFS(p , q);
// 数据输出
printf("%d\n", result);
}
return 0;
}
void DFS(int p, int q)
{
if(p <= m - 1 && p >= 0 && q >= 0 && q <= n - 1 && graph[p][q] == '.')
{
result++;
graph[p][q] = '#';
}else {
return;
}
DFS(p - 1, q);
DFS(p, q - 1);
DFS(p, q + 1);
DFS(p + 1, q);
}
瞬间高大上了,呀呀,keep fighting~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_N 20
int W, H;
char a[MAX_N][MAX_N];
int res=0;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int x,y;
void dfs(int nx, int ny)
{
if(nx >= 0 && nx < H && ny >= 0 && ny < W && a[nx][ny] =='.')
{
a[nx][ny] = '#';
res++;
}
else
return;
for(int i = 0; i < 4; i++)
{
x = nx + dx[i];
y = ny + dy[i];
if(a[x][y]=='.')
{
dfs(x,y);
}
}
}
int main()
{
int nx=0,ny=0;
while(scanf("%d%d\n",&W, &H) && (W || H))
{
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
{
nx = i;
ny = j;
}
}
getchar();
}
a[nx][ny] = '.';
dfs(nx,ny);
printf("%d\n",res);
res=0;
}
//system("PAUSE");
return 0;
}