[2010-8-25]

  1. 今天终于A了PKU的1611,之前一直在猜这题是否属于那个并查集的题目,AC过后去看DISCUSS,原来真的是,而且说是初级并查集,很多人都一次AC通过。但是尽管我猜想这题属于并查集,但我一直不肯去先学了并查集再做这题,因为正如戴维所说,应该可以通过自己的思维解决的。最后用暴力搜索解了,但这个暴力搜索正常是不行的,但我把500×30000的BOOL类型矩阵变成了500×950的INT矩阵,利用整数的每个位代表BOOL类型,马上搜索的数量级就下降了10^2,最后以1/4上限的时间AC了。不过我还是想知道到底怎么使用并查集,那并查集到底什么回事,我决定再想一想,看自己能不能想出这个并查集结构出来,同时也证明了位运算的强大。在一个依赖位组成的矩阵中,要访问[i,j]的元素,i是不变的,行依然是那么多行;唯独列变了,j/32即是对应的整数在数组中的位置索引,而j%32就是整数内的位偏移量,其实也蛮简单的。

  2. 程序又不能显示中文了,要调用setLocale函数,其实这个函数,应该是WINDOWS平台特定的吧?这个函数有两个参数,第一个还不知道什么用,不过一般都设置为枚举值LC_ALL,而第二个就是设置使用哪个本地化设置,这个参数是一个字符串,其值在这个MSDN网页中有列举:http://msdn.microsoft.com/en-us/library/39cwe7zf(v=VS.71).aspx,同时还可以设置一些国家地区代码,在这个网页有列举:http://msdn.microsoft.com/en-us/library/cdax410z(v=VS.71).aspx

  3. 昨天学了怎么用WINDOWS API的FindFirstFile,FindNextFile,FindClose函数来递归遍历文件夹,不过最初我以为那两个函数只能在当前工作目录下遍历。原来不是的,只要我在参数中指定的是一个完整(从驱动器开始)的路径,然后在路径的最后补上"*.*",那么它就可以在指定目录下遍历文件夹,例如指定"C:\\123\\456\\*.*",那么就会在C:\123\456目录下遍历所有文件和文件夹。之所以会发现这一点,是因为我打算写一个类来封装这个递归遍历的操作,但如果一个进程中出现多个这个类的实例,那么每个实例运行过程中都调用setCurrentDirectory,那么肯定天下大乱了。知道这一点以后,我修改了递归遍历函数:

代码
void EnumFolder2(LPCWSTR path)
{
WIN32_FIND_DATA data;
WCHAR currentDir[
260] = { '\0' };
lstrcat(currentDir,path);
lstrcat(currentDir,_T(
"\\*.*"));
HANDLE hFind
= ::FindFirstFile(currentDir,&data);
WCHAR subFileFullPath[
260] = { '\0' };

if(hFind != INVALID_HANDLE_VALUE)
{
do
{
wcout
<<"File Name:"<<data.cFileName<<endl;
if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(lstrcmp(data.cFileName,_T(".")) != 0 && lstrcmp(data.cFileName,_T("..")) != 0)
{
wcout
<<"----------------------------"<<data.cFileName<<endl;
lstrcat(subFileFullPath,path);
lstrcat(subFileFullPath,_T(
"\\"));
lstrcat(subFileFullPath,data.cFileName);
EnumFolder2(subFileFullPath);
wcout
<<"----------------------------"<<data.cFileName<<endl;
subFileFullPath[
0] = '\0';
}
}
}
while(::FindNextFile(hFind,&data));
::FindClose(hFind);
}
}

函数的参数是要遍历的文件夹,例如上述的"C:\\123\\456",注意是没有了后缀"\\*.*",这个留给函数自己补充上去,因为这个路径名除了用于遍历当前路径,还要用于构造每个子文件夹的路径,如果在参数中已经是"C:\\123\\456\\*.*",那么当我构造子文件夹路径时要么就会变成"C:\\123\\456\\*.*\\subDir",要么就要手工作处理,何必呢?

  4. 追加款字符串可以使用lstrcmp函数,它也属于WINDOWS API,该函数有两个参数,第一个是用于装入新追加字符串的字符数组,在MSDN上面说了,调用者需要保证它有足够的大小加入新的字符串,否则可能会越界。第二个参数就是要追加的字符串,而返回的是第一个参数字符数组的指针,如果函数处理过程出问题,该指针为NULL,完全用于指示。而且还有一点,那就是对于第一个参数的数组,必须要保证有'\0'结尾,否则一定出问题,如果想清空字符串再追加,像上述的操作那样,只要在[0]位置设置'\0'即可。

posted @ 2010-08-25 21:01  DOF_KL  阅读(181)  评论(0编辑  收藏  举报