QQ及郵箱:1 4 2 3 1 7 3 7 8 3 @qq.com
//本代碼進行了以下改動,min_probable_node全局變量取消 explore一旦得到正確結果馬上返回 這兩個改動耗時沒有減少
//void explore() 改爲 bool explore(); 遞歸看起來邏輯更清晰,空間複雜度也有微微降低,耗時不變
#include<iostream>
#include<fstream>
#include<vector>
#include<time.h>
#include<cstdlib>
using namespace std;
struct{
int semaphore[11];//semaphore[10]表示存儲值
int probable;
int semaphore_explore_recover[10];
int probable_explore_recover;
//每個節點node都可能被用來作爲探索節點,探索時從該節點可能取值的數字(1--9)從小到大依次探索,當一個節點所有取值探索過後都出現錯誤(即該節點不能去任何值)這表明這個探索節點不能取任何值是上一步的錯誤造成的,應該回溯進一步往前恢復。而要判斷該探索節點任何值都不能取就必須設一個長度爲9的數組,如果數組的每個元素都爲0表示每個取值探索過後都不成功,即需要進一步往前回溯。
} node[10][10];
int finished=0,count=0,probablew[10][10],storagew[10][10];
ofstream out_stream;
vector<int> v1;
vector<vector<int>> v2,success;
vector<vector<vector<int>>> v3;
int room(int row,int col); //返回node[row][col]所在的宮號
void fills_up(); //開始時要初始化node[10][10],使得每個節點的候選數semaphore[1--9]全爲1,probable爲9,填寫值semaphore[10]爲0;探索候選數semaphore_explore_recover[1--9]全爲0值,probable_explore_recover爲0,探索記錄數組explore[1--9]全爲0
vector<vector<int>> subtracion(int row,int col);//當node[row][col]只有一個候選數可填,且知道這個候選數,調用此函數(回溯版)
void add(int row,int col,int storage,vector<int> must_add); //node[row][col]曾經填了storage並且把別的格的storage候選數減去,這些格子的行號和列號記錄在must_add中,減什麼就恢復什麼
void addv2(vector<vector<int>> & v2); //explore()在min_probable_node的某個k(候選數)上探測得到錯誤結果,這時所有的探索記錄保存在全局變量v2中,由於傳址調用所以全局變量v2會被修改。
bool explore(); //當所有技巧或模式都用到極致時(當然也可以不用到極致,有時回溯法要來得更快,或者遍歷模式耗時太長還不如回溯來得快,當然解題高手的興奮點是最短時間發現已經知道的最難的推理模式,或發現新的不同難度係數的推理模式)要用回溯法(回溯法可嵌入技巧,一般以常用到遍歷耗時短的技巧嵌入爲佳),回溯法沒有返回值,沒有參數,形參其實就是全局變量v2,v1,返回值其實是全局變量finished
int test(); //當題目解完時檢測題目有沒有解錯,方法是每行每列每宮的和都要是45.其實技巧法和回溯法都能用數學證明,只要填滿81個格就一定是正確的,但這個函數耗時不到1毫秒 就保存了下來。
bool fun( int array[10]); //數組array的九個數如有重複返回false
bool in_not_wrong_add(int row,int col,vector<int> not_wrong_add); //node[row][col]在not_wrong_add中則返回true
int room(int row,int col)
{
return((row-1)/3*3+1+(col-1)/3);
}
void fills_up()
{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
for(int k=1;k<=9;k++)
node[i][j].semaphore[k]=1;
node[i][j].semaphore[10]=0;
node[i][j].probable=9;
node[i][j].probable_explore_recover=0;
probablew[i][j]=9;
}
}
vector<vector<int>> subtraction(int row,int col,int storage)
{
finished++;
if(finished==81) return success;
vector<vector<int>> temp;
vector<int> not_wrong_add;
for(int j=1;j<=9;j++)
if(node[row][j].semaphore[storage]==1 && node[row][j].probable!=0)
{
node[row][j].semaphore[storage]=0; //把節點中不能填的點排除
node[row][j].probable-=1; //probable即可能填的數目減1
probablew[row][j]--;
if(node[row][j].probable==1)
{
for(int k=1;k<=9;k++)
if(node[row][j].semaphore[k]==1)
{
for(int m=1;m<=9;m++)
if(k==node[row][m].semaphore[10] && m!=j)
{
not_wrong_add.push_back(100);
v2.push_back(not_wrong_add);
v1.push_back(row);
v1.push_back(j);
v1.push_back(0);
v1.push_back(100);
v2.push_back(v1);
v1.clear();
return v2;
}
for(int m=1;m<=9;m++)
if(k==node[m][j].semaphore[10] && m!=row)
{
not_wrong_add.push_back(100);
v2.push_back(not_wrong_add);
v1.push_back(row);
v1.push_back(j);
v1.push_back(0);
v1.push_back(100);
v2.push_back(v1);
v1.clear();
return v2;
}
for(int m=(row-1)/3*3+1;m<=(row-1)/3*3+3;m++)
for(int n=(j-1)/3*3+1;n<=(j-1)/3*3+3;n++)
if(k==node[m][n].semaphore[10] && !(m==row && n==j))
{
not_wrong_add.push_back(100);
v2.push_back(not_wrong_add);
v1.push_back(row);
v1.push_back(j);
v1.push_back(0);
v1.push_back(100);
v2.push_back(v1);
v1.clear();
return v2;
}
node[row][j].semaphore[10]=k;
node[row][j].semaphore[k]=0;
node[row][j].probable=0;
storagew[row][j]=k;
probablew[row][j]=0;
not_wrong_add.push_back(10);
v2.push_back(not_wrong_add);
v1.push_back(row);
v1.push_back(j);
v1.push_back(k);
v1.push_back(10);
v2.push_back(v1);
v1.clear();
temp=subtraction(row,j,k);
if(temp==success) return success;
if(temp[v2.size()-1][3]>30 && temp[v2.size()-1][3]!=400 )
goto loop;
if(temp[v2.size()-1][3]==400)
not_wrong_add.pop_back();
}
}
}
else if(node[row][j].semaphore[storage]==0 && node[row][j].probable!=0)
{
not_wrong_add.push_back(row);
not_wrong_add.push_back(j);
}
for(int i=1;i<=9;i++)
if(node[i][col].semaphore[storage]==1 && node[i][col].probable!=0)
{
node[i][col].semaphore[storage]=0; //把節點中不能填的點排除
node[i][col].probable-=1; //probable即可能填的數目減1
probablew[i][col]--;
if(node[i][col].probable==1)
{
for(int k=1;k<=9;k++)
if(node[i][col].semaphore[k]==1)
{
for(int m=1;m<=9;m++)
if(k==node[i][m].semaphore[10] && m!=col)
{
not_wrong_add.push_back(200);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(col);
v1.push_back(0);
v1.push_back(200);
v2.push_back(v1);
v1.clear();
return v2;
}
for(int m=1;m<=9;m++)
if(k==node[m][col].semaphore[10] && m!=i)
{
not_wrong_add.push_back(200);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(col);
v1.push_back(0);
v1.push_back(200);
v2.push_back(v1);
v1.clear();
return v2;
}
for(int m=(i-1)/3*3+1;m<=(i-1)/3*3+3;m++)
for(int n=(col-1)/3*3+1;n<=(col-1)/3*3+3;n++)
if(k==node[m][n].semaphore[10] && !(m==i && n==col))
{
not_wrong_add.push_back(200);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(col);
v1.push_back(0);
v1.push_back(200);
v2.push_back(v1);
v1.clear();
return v2;
}
node[i][col].semaphore[10]=k;
node[i][col].semaphore[k]=0;
node[i][col].probable=0;
storagew[i][col]=k;
probablew[i][col]=0;
not_wrong_add.push_back(20);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(col);
v1.push_back(k);
v1.push_back(20);
v2.push_back(v1);
v1.clear();
temp=subtraction(i,col,k);
if(temp==success) return success;
if(temp[v2.size()-1][3]>30 && temp[v2.size()-1][3]!=400 )
goto loop;
if(temp[v2.size()-1][3]==400)
not_wrong_add.pop_back();
}
}
}
else if(node[i][col].semaphore[storage]==0 && node[i][col].probable!=0)
{
not_wrong_add.push_back(i);
not_wrong_add.push_back(col);
}
for(int i=(row-1)/3*3+1;i<=(row-1)/3*3+3;i++)
for(int j=(col-1)/3*3+1 ;j<=(col-1)/3*3+3;j++)
{
if(i==row) break;//調試後發現 如果區塊中碰到在行列中已經減掉k=storage值,但node[row][col].probable!=0 這是node[i][j]其實被減但會壓入not_wrong_add中最後得不到修復
if(j==col) continue;
if(node[i][j].semaphore[storage]==1 && node[i][j].probable!=0)
{
node[i][j].semaphore[storage]=0; //把節點中不能填的點排除
node[i][j].probable-=1; //probable即可能填的數目減1
probablew[i][j]--;
if(node[i][j].probable==1)
{
for(int k=1;k<=9;k++)
if(node[i][j].semaphore[k]==1)
{
for(int m=1;m<=9;m++)
{
if(node[i][m].semaphore[10]==k && m!=j)
{
not_wrong_add.push_back(300);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(j);
v1.push_back(0);
v1.push_back(300);
v2.push_back(v1);
v1.clear();
return v2;
}
}
for(int m=1;m<=9;m++)
{
if(node[m][j].semaphore[10]==k && m!=i)
{
not_wrong_add.push_back(300);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(j);
v1.push_back(0);
v1.push_back(300);
v2.push_back(v1);
v1.clear();
return v2;
}
}
for(int m=(row-1)/3*3+1;m<=(row-1)/3*3+3;m++)
for( int n=(col-1)/3*3+1;n<=(col-1)/3*3+3;n++)
{
if(k==node[m][n].semaphore[10] && !(m==i && n==j))
{
not_wrong_add.push_back(300);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(j);
v1.push_back(0);
v1.push_back(300);
v2.push_back(v1);
v1.clear();
return v2;
}
}
node[i][j].semaphore[10]=k;
node[i][j].semaphore[k]=0;
node[i][j].probable=0;
storagew[i][j]=k;
probablew[i][j]=0;
not_wrong_add.push_back(30);
v2.push_back(not_wrong_add);
v1.push_back(i);
v1.push_back(j);
v1.push_back(k);
v1.push_back(30);
v2.push_back(v1);
v1.clear();
temp=subtraction(i,j,k);
if(temp==success) return success;
if(temp[v2.size()-1][3]>30 && temp[v2.size()-1][3]!=400 )
goto loop;
if(temp[v2.size()-1][3]==400)
not_wrong_add.pop_back();
}
}
}
else if(node[i][j].semaphore[storage]==0 && node[i][j].probable!=0)
{
not_wrong_add.push_back(i);
not_wrong_add.push_back(j);
}
}
not_wrong_add.push_back(400);
v2.push_back(not_wrong_add);
v1.push_back(row);
v1.push_back(col);
v1.push_back(1);
v1.push_back(400);
v2.push_back(v1);
v1.clear();
loop: return v2;
}
int test()
{
int sum=0,i,j,aray[10];
for(int i=1;i<=9;i++)
{
sum=0;
for(int j=1;j<=9;j++)
{ sum+=node[i][j].semaphore[10]; aray[j]=node[i][j].semaphore[10];}
if(sum!=45) {cout<<"wrong"<<endl; return 0;}
if(!fun(aray)) return 0;
}
for( j=1;j<=9;j++)
{
sum=0;
for(i=1;i<=9;i++)
{ sum+=node[i][j].semaphore[10]; aray[i]=node[i][j].semaphore[10];}
if(sum!=45) {cout<<"wrong"<<endl; return 0;}
if(!fun(aray)) return 0;
}
for(int k=1;k<=9;k++)
{
sum=0;
int row=(k-1)/3*3+1,col=(k-1)%3*3+1,sub=1;
for(i=row;i<=row+2;i++)
for(j=col;j<=col+2;j++)
{ sum+=node[i][j].semaphore[10]; aray[sub++]=node[i][j].semaphore[10];}
if(sum!=45) {cout<<"wrong"<<endl; return 0;}
if(!fun(aray)) return 0;
}
return 1;
}
bool fun( int a[10])
{
int i,j;
for(i=1;i<=8;i++)
{
if(*(a+i)==0) continue;
for(j=i+1;j<=9;j++)
if(*(a+i)==*(a+j)) return (false);
}
return (true);
}
bool in_not_wrong_add(int row,int col,vector<int> not_wrong_add) //node[row][col]在not_wrong_add中則返回true
{
for(int i=1; i<=(not_wrong_add.size()-1)/2; i++)
if(row==not_wrong_add[2*i-2] && col==not_wrong_add[2*i-1])
return (true);
return (false);
}
void add(int row1,int col1,int row2,int col2,int storage,int semaphore,vector<int> not_wrong_add)//semaphore的值爲100,200,300,400 表示從四個方向上恢復
{
finished--;
switch(semaphore)
{
case 100: for(int j=col2;j>=1;j--)
if(node[row1][j].semaphore[storage]==0 && node[row1][j].probable!=0/* && !in_not_wrong_add(row1,j,not_wrong_add)*/ )//這一行最後面那個函數是調試後打的補丁 用處是不該恢復的不恢復
{
node[row1][j].semaphore[storage]=1;
node[row1][j].probable+=1;
probablew[row1][j]++;
} break;
case 200: for(int i=row2;i>=1;i--)
if(node[i][col2].semaphore[storage]==0 && node[i][col2].probable!=0 /*&& !in_not_wrong_add(i,col2,not_wrong_add)*/ )
{
node[i][col2].semaphore[storage]=1;
node[i][col2].probable+=1;
probablew[i][col2]++;
}
for(int j=9;j>=1;j--)
if(node[row1][j].semaphore[storage]==0 && node[row1][j].probable!=0 /*&& !in_not_wrong_add(row1,j,not_wrong_add)*/ )
{
node[row1][j].semaphore[storage]=1;
node[row1][j].probable+=1;
probablew[row1][j]++;
} break;
case 300: for(int j=col2;j>=(col2-1)/3*3+1;j--)
if(node[row2][j].semaphore[storage]==0 && node[row2][j].probable!=0 /*&& !in_not_wrong_add(row2,j,not_wrong_add)*/ )
{
node[row2][j].semaphore[storage]=1;
node[row2][j].probable+=1;
probablew[row2][j]++;
}
for(int i=row2-1;i>=(row2-1)/3*3+1;i--)
for(int j=(col2-1)/3*3+3;j>=(col2-1)/3*3+1;j--)
if(node[i][j].semaphore[storage]==0 && node[i][j].probable!=0 /*&& !in_not_wrong_add(i,j,not_wrong_add)*/ )
{
node[i][j].semaphore[storage]=1;
node[i][j].probable+=1;
probablew[i][j]++;
}
for(int i=9;i>=1;i--)
if(node[i][col1].semaphore[storage]==0 && node[i][col1].probable!=0 /*&& !in_not_wrong_add(i,col1,not_wrong_add)*/ )
{
node[i][col1].semaphore[storage]=1;
node[i][col1].probable+=1;
probablew[i][col1]++;
}
for(int j=9;j>=1;j--)
if(node[row1][j].semaphore[storage]==0 && node[row1][j].probable!=0 /*&& !in_not_wrong_add(row1,j,not_wrong_add)*/)
{
node[row1][j].semaphore[storage]=1;
node[row1][j].probable+=1;
probablew[row1][j]++;
}
break;
case 400: for(int i=(row2-1)/3*3+3;i>=(row2-1)/3*3+1;i--)
for(int j=(col2-1)/3*3+3;j>=(col2-1)/3*3+1;j--)
if(node[i][j].semaphore[storage]==0 && node[i][j].probable!=0 /*&& !in_not_wrong_add(i,j,not_wrong_add)*/)
{
node[i][j].semaphore[storage]=1;
node[i][j].probable+=1;
probablew[i][j]++;
}
for(int i=9;i>=1;i--)
if(node[i][col1].semaphore[storage]==0 && node[i][col1].probable!=0 /*&& !in_not_wrong_add(i,col1,not_wrong_add)*/)
{
node[i][col1].semaphore[storage]=1;
node[i][col1].probable+=1;
probablew[i][col1]++;
}
for(int j=9;j>=1;j--)
if(node[row1][j].semaphore[storage]==0 && node[row1][j].probable!=0 /*&& !in_not_wrong_add(row1,j,not_wrong_add)*/)
{
node[row1][j].semaphore[storage]=1;
node[row1][j].probable+=1;
probablew[row1][j]++;
}
break;
}
node[row1][col1].semaphore[storage]=1;
node[row1][col1].probable+=1; //node[row][col].storage的值最後變回0,下面恢復三個區域要用到這個值。
node[row1][col1].semaphore[10]=0;
probablew[row1][col1]++;
storagew[row1][col1]=0;
if(node[row1][col1].probable_explore_recover!=0)
{
for(int i=1;i<=9;i++)
node[row1][col1].semaphore[i]=node[row1][col1].semaphore_explore_recover[i];
probablew[row1][col1]=node[row1][col1].probable=node[row1][col1].probable_explore_recover;
for(int i=1;i<=9;i++) //調試發現的 後來加上
node[row1][col1].semaphore_explore_recover[i]=0;
node[row1][col1].probable_explore_recover=0; //調試發現的,後來加上
//min_probable_node.row=row1;
//min_probable_node.col=col1;
//probable=node[row1][col1].probable;
}
for(int i=1; i<=(not_wrong_add.size()-1)/2; i++)
{
node[not_wrong_add[2*i-2]][not_wrong_add[2*i-1]].semaphore[storage]=0 ;
node[not_wrong_add[2*i-2]][not_wrong_add[2*i-1]].probable--;
probablew[not_wrong_add[2*i-2]][not_wrong_add[2*i-1]]--;
}
}
void addv2(vector<vector<int>> & v2)
{
vector<vector<int>> v2_transcript;
v2_transcript.push_back(v2[v2.size()-1]);
v2_transcript.push_back(v2[v2.size()-2]);
v2.pop_back();
v2.pop_back();
for( int i=v2.size()-1;i>=0;i--)
{
if( v2[i][v2[i].size()-1]==400)
{
v2_transcript.push_back(v2[i]);
v2.pop_back();
continue;
}
if(v2_transcript[v2_transcript.size()-2][3]==400 && v2.size()>1 )// && v2_transcript[v2_transcript.size()-1][0]==v2[i][0] && v2_transcript[v2_transcript.size()-1][1]==v2[i][1] )
{
add(v2[i][0],v2[i][1],v2[i][0],v2[i][1],v2[i][2],400,v2_transcript[v2_transcript.size()-1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2.pop_back();
v2.pop_back();
i--;
continue;
}
if(v2.size()>1 && (v2_transcript[0][3]==10 || v2_transcript[0][3]==20 || v2_transcript[0][3]==30) )
{
add(v2[i][0],v2[i][1],v2_transcript[0][0],v2_transcript[0][1],v2[i][2],v2_transcript[0][3]*10,v2_transcript[1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2_transcript.push_back(v2[i]);
v2_transcript.push_back(v2[i-1]);
v2.pop_back();
v2.pop_back();
i--;
continue;
}
if(v2.size()==1 && (v2_transcript[0][3]==10 || v2_transcript[0][3]==20 || v2_transcript[0][3]==30) )
{
add(v2[0][0],v2[0][1],v2_transcript[0][0],v2_transcript[0][1],v2[0][2],v2_transcript[0][3]*10,v2_transcript[1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2.pop_back();
break;
}
if( v2.size()==1 && v2_transcript[0][3]==400 )
{
add(v2[0][0],v2[0][1],v2[0][0],v2[0][1],v2[0][2],400,v2_transcript[1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2.pop_back();
break;
}
if(v2.size()>1 && (v2_transcript[0][3]==100 || v2_transcript[0][3]==200 || v2_transcript[0][3]==300 ) )
{
add(v2[i][0],v2[i][1],v2_transcript[0][0],v2_transcript[0][1],v2[i][2],v2_transcript[0][3],v2_transcript[1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2_transcript.push_back(v2[i]);
v2_transcript.push_back(v2[i-1]);
v2.pop_back();
v2.pop_back();
i--;
continue;
}
if(v2.size()==1 && ((v2_transcript[0][3]==100 ) || (v2_transcript[0][3]==200 ) || (v2_transcript[0][3]==300 )) )
{
add(v2[i][0],v2[i][1],v2_transcript[0][0],v2_transcript[0][1],v2[i][2],v2_transcript[0][3],v2_transcript[1]);
v2_transcript.pop_back();
v2_transcript.pop_back();
v2.pop_back();
break;
}
}//for
}
bool explore( )
{
int row,col,probable;
probable=10;
for(int i=9;i>=1;i--)
{
for(int j=9 ;j>=1;j--)
{
if(probable>=node[i][j].probable && node[i][j].probable!=0 )
{ probable=node[i][j].probable;
row=i;
col=j;
}
}
}
count++;
for(int k=1;k<=9;k++)
{
if(node[row][col].semaphore[k]==1)
{
for(int r=1;r<=9;r++)
if(node[row][r].semaphore[10]==k )
goto loop;
for(int r=1;r<=9;r++)
if(node[r][col].semaphore[10]==k )
goto loop;
for( int i=(room(row,col)-1)/3*3+1;i<=(room(row,col)-1)/3*3+3;i++)
for(int j=(room(row,col)-1)%3*3+1;j<=(room(row,col)-1)%3*3+3;j++)
if(node[i][j].semaphore[10]==k)
goto loop;
for(int r=1;r<=9;r++)
node[row][col].semaphore_explore_recover[r]=node[row][col].semaphore[r];
node[row][col].probable_explore_recover=node[row][col].probable;
for(int r=1;r<=9;r++)
node[row][col].semaphore[r]=0;
node[row][col].probable=0;
node[row][col].semaphore[10]=k;
probablew[row][col]=0;
storagew[row][col]=k;
v1.push_back(row);
v1.push_back(col);
v1.push_back(node[row][col].semaphore[10]);
v1.push_back(0);
v2.push_back(v1);
v1.clear();
if(subtraction(row,col,k)==success)
return(true);
else if(v2[v2.size()-1][3]>30 && v2[v2.size()-1][3]!=400)
{
addv2(v2);
v2.clear();
}
else
{
v3.push_back(v2);
v2.clear();
explore();
if(finished==81)
return(true);
else
{
addv2(v3[v3.size()-1]);
v3.pop_back();
}
}
}
loop: ;
}
return(false);
}
int main()
{
int information_number=0;
long time;
char char_start[82];
int int_start[82];
ifstream cin_stream;
cin_stream.open("d:\\c++\\數獨12\\question\\fenlan.txt");
cin_stream>>char_start;
for(int i=1;i<82;i++)
int_start[i]=char_start[i-1]-'0';
for(int i=1;i<82;i++)
{
int row,col;
if(int_start[i]!=0)
{
row=(i-1)/9+1;
col=i-9*(row-1);
v1.push_back(row);
v1.push_back(col);
v1.push_back(int_start[i]);
v2.push_back(v1);
v1.clear();
}
}
information_number=v2.size();
cin_stream.close();
out_stream.open("d:\\c++\\數獨12\\question\\question472.txt");
time=clock();
fills_up();
for(int i=0;i<information_number;i++)
{
for(int k=1;k<=9;k++)
node[v2[i][0]][v2[i][1]].semaphore[k]=0;
node[v2[i][0]][v2[i][1]].probable=0;
node[v2[i][0]][v2[i][1]].semaphore[10]=v2[i][2];
probablew[v2[i][0]][v2[i][1]]=0;
storagew[v2[i][0]][v2[i][1]]=v2[i][2];
}
vector<vector<int>> v2_temporary;
for(int i=0;i<information_number;i++)
{
v2_temporary=subtraction(v2[i][0],v2[i][1],v2[i][2]);
if(v2_temporary==success)
break;
if(v2_temporary[v2.size()-1][3]==400) continue;
if(v2_temporary[v2.size()-1][3]==100 || v2_temporary[v2.size()-1][3]==200 ||v2_temporary[v2.size()-1][3]==300)
{
cout<<"數組題目設計錯誤"<<endl;
}
}
v2.clear();
if(finished==81 && test()) ;
explore();
if(test())
{
out_stream<<endl;
time=clock()-time;
out_stream<<"用時(不含輸入數據時間)"<<time/1000<<"秒"<<time%1000<<"毫秒"<<endl;
cout<<"用時(不含輸入數據時間)"<<time/1000<<"秒"<<time%1000<<"毫秒"<<endl;
cout<<"right"<<endl;
}
out_stream.close();
system("pause");
}