ShowDlg.cpp
上传用户:kanghaisi
上传日期:2017-04-20
资源大小:5727k
文件大小:10k
源码类别:

DNA

开发平台:

Visual C++

  1. // ShowDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DNA.h"
  5. #include "ShowDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #define maxNode 20//最大顶点数
  11. #define codeLen  20//边的编码长度
  12. static  char code[maxNode][codeLen+1]={//边的编码
  13.     "CAACCCAAAACCTGGTAGAG",
  14. "ATATCGCGGGTTCAACGTGC",
  15. "ACGTTGACATGCAGGATCGA",
  16. "TATAGTACTGATCTGTAGTC",
  17. "AACCTGGTACCAGACTTGAC",
  18. "TGGTTTGGACTGGTCAAGTT",
  19. "TATAGCGCATGCAGGATCGA"
  20. };
  21. static int AdjMatrix[maxNode][maxNode];
  22. int arc;
  23. char s[maxNode*maxNode][maxNode*codeLen+1];//保存所有生成路径的编码
  24. char newstr[maxNode*codeLen+1];
  25. char result[maxNode][maxNode+1];//保存正确结果路径
  26. char resultold[maxNode][maxNode+1];//传统方法保存正确结果 路径
  27. int answer=0;//最终路径数
  28. int answerold=0;//传统方法的最终路径数
  29. bool flagold[maxNode];
  30. int  travalold[maxNode];
  31. //bool flag[maxNode];//标志每个顶点是否出现过
  32. //int  traval[maxNode];//保存路径
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CShowDlg dialog
  36. CShowDlg::CShowDlg(CWnd* pParent /*=NULL*/)
  37. : CDialog(CShowDlg::IDD, pParent)
  38. {
  39. //{{AFX_DATA_INIT(CShowDlg)
  40. m_result = _T("");
  41. m_graph = _T("");
  42. m_resultold = _T("");
  43. m_head = 0;
  44. m_tail = 0;
  45. m_vertex = 0;
  46. m_arc = 0;
  47. m_multiresult = _T("");
  48. //}}AFX_DATA_INIT
  49. }
  50. void CShowDlg::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CDialog::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(CShowDlg)
  54. DDX_Control(pDX, IDC_MULTITHREADRUN, m_multithreadrun);
  55. DDX_Control(pDX, IDC_RUNOLD, m_runold);
  56. DDX_Control(pDX, IDC_FINISH, m_finish);
  57. DDX_Control(pDX, IDC_ADD, m_add);
  58. DDX_Control(pDX, IDC_RUNOK, m_runok);
  59. DDX_Text(pDX, IDC_RESULT, m_result);
  60. DDX_Text(pDX, IDC_GRAPH, m_graph);
  61. DDX_Text(pDX, IDC_RESULTOLD, m_resultold);
  62. DDX_Text(pDX, IDC_HEAD, m_head);
  63. DDX_Text(pDX, IDC_TAIL, m_tail);
  64. DDX_Text(pDX, IDC_VERTEX, m_vertex);
  65. DDX_Text(pDX, IDC_ARC, m_arc);
  66. DDX_Text(pDX, IDC_MULTIRESULT, m_multiresult);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CShowDlg, CDialog)
  70. //{{AFX_MSG_MAP(CShowDlg)
  71. ON_BN_CLICKED(IDC_RUNOK, OnRunok)
  72. ON_BN_CLICKED(IDC_ADD, OnAdd)
  73. ON_BN_CLICKED(IDC_FINISH, OnFinish)
  74. ON_BN_CLICKED(IDC_RUNOLD, OnRunold)
  75. //}}AFX_MSG_MAP
  76. END_MESSAGE_MAP()
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CShowDlg message handlers
  79. void CShowDlg::init()
  80. {
  81. char fileName[1][10];//文件名,保存形成的路径
  82. int u,v;  
  83. char str[2*codeLen+1];
  84. FILE *fpTest,*fp2;
  85. strcpy(fileName[0],"0.txt");//将0.txt赋值给fileName[0]
  86. if(!(fpTest=fopen("Test.txt","r"))) 
  87. {
  88. MessageBox("不能打开Test.txt文件!");
  89. return ;
  90. }   
  91.     if(!(fp2=fopen(fileName[0],"w"))) 
  92. {
  93. MessageBox("不能打开0.txt文件!");
  94. return ;
  95.     
  96. //将test.txt文件中的点的个数和边的条数分别赋值给nodeN和edgeN
  97.    // fscanf(fpTest,"%d%d",&nodeN,&edgeN);
  98.     while(arc--)
  99.     {
  100.         fscanf(fpTest,"%d%d",&u,&v); //将边的信息依次读入u,v中
  101. char temp[codeLen+1];
  102. int k;
  103. //对边进行编码
  104. if(u!=0)//u不是起点
  105. {
  106. //顶点编码的后部分
  107. for(k=0;k<codeLen/2;k++)
  108. temp[k]=code[u][k+codeLen/2];
  109. temp[k]='';
  110. strcpy(str,temp);
  111. }
  112. else
  113.             strcpy(str,code[u]);//起点的全部编码
  114. if(v!=m_vertex-1)//v不是终点
  115. {
  116. //编码的前部分
  117. for(k=0;k<codeLen/2;k++)
  118. temp[k]=code[v][k];
  119. temp[k]='';
  120. strcat(str,temp);
  121. }
  122. else
  123. strcat(str,code[v]);
  124.         fprintf(fp2,"%sn",str);//将str的内容写入fp2中      
  125.     } 
  126.     fclose(fpTest);
  127.     fclose(fp2); 
  128.     return ;
  129. }
  130. int CShowDlg::getid(char *str, int n)
  131. {
  132. int i;
  133. for(i=0;i<n;i++)
  134. if(strcmp(str,code[i])==0)
  135. {
  136. return i;
  137. }
  138. return -1;
  139. }
  140. bool CShowDlg::str_compare(char *str, int n)
  141. {
  142. bool flag[maxNode];//标志每个顶点是否出现过
  143.     int  traval[maxNode];//保存路径
  144. char s[codeLen+1];
  145. int i,k,j,len;
  146. for(i=0;i<codeLen;i++)
  147. s[i]=str[i];    
  148. s[i]='';
  149. //如果str第一个顶点不是顶点0,则舍弃
  150. if(strcmp(s,code[0])!=0)
  151. return false;
  152. len=strlen(str);
  153. k=0; 
  154. for(i=len-codeLen;i<len;i++)
  155. s[k++]=str[i] ;
  156. s[k]='';
  157. //如果str最后一个顶点不是顶点nodeN-1,则舍弃
  158. if(strcmp(s,code[n-1])!=0)
  159. return false;
  160. //将所有的flag均设置为false
  161. memset(flag,false,sizeof(flag));
  162. flag[0]=flag[n-1]=true;
  163. k=0;
  164. j=0;
  165. traval[j++]=0;
  166. for(i=codeLen;i<len-codeLen;i++)
  167. {
  168. s[k++]=str[i];
  169. if(k==codeLen)
  170. {
  171. s[k]='';
  172. k=0;   
  173. int t=getid(s,n); 
  174. flag[t]=true;
  175. traval[j++]=t;  
  176. }
  177. for(i=0;i<n;i++)
  178. if(!flag[i])
  179. return false;
  180. traval[n-1]=n-1;
  181. {   
  182. for(i=0;i<n;i++)
  183.              result[answer][i]=traval[i];
  184. answer++;
  185. }               
  186. return true;     
  187. }
  188. int CShowDlg::head(char *str, char *strCode)//判断编码的头部是否匹配
  189. {
  190.     int i;
  191.     char temp[11],temps[11];
  192.     for(i=0;i<codeLen/2;i++)
  193. temp[i]=str[i];
  194. temp[i]='';
  195.     for(i=0;i<codeLen/2;i++)
  196. temps[i]=strCode[i+codeLen/2];
  197. temps[i]='';
  198.     return strcmp(temp,temps)==0;     
  199. }
  200. int CShowDlg::tail(char *str, char *strCode)
  201. {
  202.     int i,k,len;
  203. char temp[11],temps[11];
  204. len=strlen(str);
  205. for(i=len-codeLen/2,k=0;i<len;i++)
  206. temp[k++]=str[i];
  207. temp[k]='';
  208. len=strlen(strCode);
  209. for(i=0,k=0;i<codeLen/2;i++)
  210. temps[k++]=strCode[i];
  211. temps[k]='';
  212. return strcmp(temp,temps)==0;   
  213. }
  214. void CShowDlg::connect(int n)
  215. {
  216.     FILE *fp1,*fpi,*fpj;
  217. int i,j,m;
  218. char fileName[maxNode][15];
  219. char select[codeLen+1];//加入的点 
  220. for(i=0;i<n;i++)
  221. {
  222. fileName[i][0]=i+'0';
  223. fileName[i][1]='';
  224. strcat(fileName[i],".txt");                   
  225. }
  226. char str[maxNode*codeLen+1];
  227. bool flaghead,flagtail;
  228. fp1=fopen(fileName[0],"r");
  229. i=0;
  230. //读入边
  231. while(!feof(fp1))
  232. {
  233. fscanf(fp1,"%s",s[i]);
  234. i++;
  235. }
  236. m=i-1;
  237.     fclose(fp1);
  238. for(i=1;i<n-1;i++)
  239. {
  240. strcpy(select,code[i]);//将第i个顶点的编码赋值给select
  241. fpi=fopen(fileName[i-1],"r");
  242. fpj=fopen(fileName[i],"w");
  243. while(!feof(fpi))
  244. {
  245. fscanf(fpi,"%s",str);//将长度为i-1的串读入str中
  246. if(feof(fpi))break;
  247. flaghead=flagtail=false;
  248. if(head(str,select))//str的头部与第i个顶点的编码匹配
  249. flaghead=true;
  250. if(tail(str,select))//str的尾部与第i个顶点的编码匹配
  251. flagtail=true;
  252. for(j=0;j<m;j++)
  253. {
  254. if(head(s[j],select)&&flagtail)
  255. {
  256. strcpy(newstr,str);
  257. strcat(newstr,s[j]);
  258. fprintf(fpj,"%sn",newstr);                           
  259. }
  260. if(tail(s[j],select)&&flaghead)
  261. {
  262. strcpy(newstr,s[j]);
  263. strcat(newstr,str);
  264. fprintf(fpj,"%sn",newstr);                           
  265. }              
  266. }              
  267. }
  268. fclose(fpi);
  269. fclose(fpj);              
  270. }
  271. return ;  
  272. }
  273. void CShowDlg::gettravel(int n)
  274. {
  275. char str[maxNode*codeLen+1];
  276. FILE *fp;
  277. int i;
  278. char fileName[maxNode][10];
  279. //将文件名分别赋值为i.txt(i=0,1,...,n-1)
  280. for(i=0;i<n;i++)
  281. {
  282. fileName[i][0]=i+'0';
  283. fileName[i][1]='';
  284. strcat(fileName[i],".txt");                   
  285. }
  286. fp=fopen(fileName[n-2],"r");
  287. while(!feof(fp))
  288. {
  289. fscanf(fp,"%s",str);
  290. if(feof(fp))break;
  291. if(strlen(str)!=n*codeLen)
  292. continue;
  293. str_compare(str,n);
  294. }
  295. fclose(fp);
  296. return ;
  297. }
  298. void CShowDlg::OnRunok() 
  299. {
  300. // TODO: Add your control notification handler code here
  301. int i,j,n;
  302. n=m_vertex;
  303.      init(); 
  304. connect(m_vertex);
  305. gettravel(m_vertex);
  306. m_result="";
  307. CString strTemp;
  308. for(i=0;i<answer;i++)
  309. {
  310. for(j=0;j<n;j++)
  311. {
  312. strTemp.Format("%d",result[i][j]);
  313. m_result+=strTemp;
  314. m_result+=" ";
  315. }
  316.             m_result+="rn";
  317.              i++;
  318. }
  319. UpdateData(FALSE);
  320. }
  321. void CShowDlg::OnAdd() 
  322. {
  323. // TODO: Add your control notification handler code here
  324. UpdateData(TRUE);
  325. FILE *fpTest;
  326.      if(!(fpTest=fopen("Test.txt","a"))) 
  327. {
  328. MessageBox("不能打开Test.txt文件!");
  329. }  
  330.  fprintf(fpTest,"%d %dn",m_head,m_tail);
  331.      fclose(fpTest);
  332.  
  333.     // fscanf(fpi,"%s",str);//将长度为i-1的串读入str中
  334. UpdateData(FALSE);
  335.     }
  336. void CShowDlg::OnFinish() 
  337. {
  338. // TODO: Add your control notification handler code here
  339. UpdateData(TRUE);
  340. int u,v,n;
  341. FILE *fpTest;
  342.      if(!(fpTest=fopen("Test.txt","r"))) 
  343. {
  344. MessageBox("不能打开Test.txt文件!");
  345. }  
  346. n=m_vertex;
  347. arc=m_arc;
  348. for(u=0;u<m_vertex;u++)
  349. for(v=0;v<m_vertex;v++)
  350. AdjMatrix[u][v]=0;
  351.       while(!feof(fpTest)) 
  352.   {
  353.   fscanf(fpTest,"%d%d",&u,&v);
  354.   AdjMatrix[u][v]=1;
  355.   }     
  356.   fclose(fpTest);
  357.    m_graph="";
  358. CString strTemp;
  359. for(u=0;u<m_vertex;u++)
  360. {
  361. for(v=0;v<m_vertex;v++)
  362. {
  363. strTemp.Format("%d",AdjMatrix[u][v]);
  364. m_graph+=strTemp;
  365. m_graph+=" ";
  366. }
  367.             m_graph+="rn";         
  368. }
  369.  UpdateData(FALSE);
  370. }
  371. void CShowDlg::OnRunold() 
  372. {
  373. // TODO: Add your control notification handler code here
  374.     int i,j;
  375.     solve();
  376. m_resultold="";
  377. CString strTemp;
  378. for(i=0;i<answerold;i++)
  379. {
  380. for(j=0;j<m_vertex;j++)
  381. {
  382. strTemp.Format("%d",resultold[i][j]);
  383. m_resultold+=strTemp;
  384. m_resultold+=" ";
  385. }
  386.             m_resultold+="rn";             
  387. }
  388. UpdateData(FALSE);
  389.     return ;  
  390. }
  391. void CShowDlg::Tradtion(int t,int d)
  392. {
  393.     int i; 
  394.   travalold[d]=t;   
  395.    if(d==m_vertex-1)
  396.    {
  397.       if(travalold[m_vertex-1]==m_vertex-1)
  398.       {
  399.       for(i=0;i<m_vertex;i++)
  400.       resultold[answerold][i]=travalold[i];    
  401.       }  
  402.   answerold++;
  403.       return ;     
  404.    }
  405.   
  406.    for(i=1;i<m_vertex;i++)
  407.    if(!flagold[i]&&AdjMatrix[t][i])
  408.    {
  409.       flagold[i]=true;
  410.       Tradtion(i,d+1);
  411.       flagold[i]=false;            
  412.    }
  413.    return ;
  414. }
  415. void CShowDlg::solve()
  416. {
  417.    int i;
  418.    memset(flagold,false,sizeof(flagold)); 
  419.    flagold[0]=true;
  420.    travalold[0]=0;
  421.    for(i=1;i<m_vertex;i++)
  422.    if(AdjMatrix[0][i])
  423.    {
  424.    flagold[i]=true;
  425.    Tradtion(i,1);
  426.    flagold[i]=false;
  427.    }
  428.    return ;    
  429. }